Java基础数组-选择排序算法

导读:本篇文章讲解 Java基础数组-选择排序算法,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

选择排序:

  • 每一次从这堆“参与比较的数据当中”找出最小值
  • 拿着这个最小值和“参与比较的这堆最前面的元素”交换位置。

选择排序比冒泡排序好在:每一次的交换位置都是有意义的。

关键点:选择排序中的关键在于,你怎么找出一堆数据中最小的。
3 2 6 1 5

  • 假设:

    • 第一个3是最小的。

    • ​ 3和2比较,发现2更小,所以此时最小的是2.

    • 继续拿着2往下比对,2和6比较,2仍然是最小的。

    • 继续拿着2往下比对,2和1比对,发现1更小,所以此时最小的是1.

    • 继续拿着1往下比对,1和5比对,发现1还是小的,所以1就是最小的。

    • 拿着1和最左边的3交换位置。

    • 假设:

    • 第一个2是最小的。

    6 3 5

  • 假设6是最小的:

  • 6和3比对,发现3更小,所以此时最小的是3.

  • ​ …


选择排序比冒泡排序的效率高。

  • 高在交换位置的次数上。
  • 选择排序的交换位置是有意义的。

循环一次,然后找出参加比较的这堆数据中最小的,拿着这个最小的值和
最前面的数据“交换位置”。

参与比较的数据:3 1 6 2 5 (这一堆参加比较的数据中最左边的元素下标是0)
第1次循环之后的结果是:
1 3 6 2 5

参与比较的数据:3 6 2 5 (这一堆参加比较的数据中最左边的元素下标是1)
第2次循环之后的结果是:
2 6 3 5

参与比较的数据:6 3 5 (这一堆参加比较的数据中最左边的元素下标是2)
第3次循环之后的结果是:
3 6 5

参与比较的数据:6 5 (这一堆参加比较的数据中最左边的元素下标是3)
第4次循环之后的结果是:
5 6

注意:5条数据,循环4次。

示例代码:

public class SelectSort {
    public static void main(String[] args) {

        //初始化一个一维数组
        int[] arr = {3,1,6,2,5,8,4};

        int count = 0;
        int count2 = 0;
        //选择排序
        //7条数据循环6次。(外层循环6次)
        for(int i = 0;i< arr.length-1;i++){
            //猜测最小值
            //i正好是“参加比较的这堆数据中“最左边那个元素的下标”
            //i是一个参与比较的这堆数据中的起点下标
            //假设起点i下标位置上的元素是最小的
            int min = i;
            for(int j = i + 1;j< arr.length;j++) {
                //统计比较次数
                count++;
                if (arr[j] < arr[min]) {
                    min = j;//最小值的元素下标是j
                }
            }
                //当i和min相等时,表示最初猜测是对的
                //当i和min不相等是,表示最初猜测是错的,有比这个元素更小的元素
                //需要拿着这个更小的元素和最左边的元素交换位置
                if (min != i) {
                    //表示存在更小的数据
                    //arr[min]最小的数据
                    //arr[i] 最前面的数据
                    int temp;
                    temp = arr[min];
                    arr[min] = arr[i];
                    arr[i] = temp;
                    //统计交换次数
                    count2++;
            }
        }
        // 冒泡排序和选择排序实际上比较的次数没变。
        // 交换位置的次数减少了。
        System.out.println("比较了多少次:" + count);
        System.out.println("交换了多少次:" + count2);

        //遍历排序之后的数组
        for (int i = 0;i< arr.length;i++){
            System.out.println(arr[i]);
        }
    }
}

运行结果:

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/87623.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!