Java 实现选择排序


选择排序介绍

原理:
每次选择外层循环当前的索引,接着内层循环中,通过判断,找到最小值或最大值的索引位置;再交换两个索引上的值。

改进了冒泡排序,交换次数从O(N^2)减少到O(N), 而比较次数还是O(N^2) ,实际上交换次数最大就等于N-1次


从前向后选择

从前向后选择;每次内层循环找到最小值索引,交换到前面去,前面有序

public void sort1(int[] ary) {
    long startTime = System.nanoTime();

    int selectIndex;
    int len = ary.length;
    for (int i = 0; i < len; i++) {
        selectIndex = i;
        for (int j = i + 1; j < len; j++) {
            if (ary[selectIndex] > ary[j]) {
                selectIndex = j; //每轮内层循环得到最小值的 index
            }
            //如下则是得到大的 index
//                if (ary[j] > ary[selectIndex]) {
//                    selectIndex = j; //每轮内层循环得到最大值的 index
//                }
        }
        if (selectIndex != i) {
            Util.swap(ary, selectIndex, i);
        }
//            System.out.println(Arrays.toString(ary));
    }

    System.out.println("total time:" + ((System.nanoTime() - startTime) / 1.0e9));
}

从后向前选择

从后向前选择;每次内层循环找到最大值索引,交换到后面去,后面有序

public void sort2(int[] ary) {
   long startTime = System.nanoTime();

   int len = ary.length;
   int selectIndex;
   for (int i = len - 1; i >= 0; i--) {
       selectIndex = i;
       for (int j = i - 1; j >= 0; j--) {
           if (ary[selectIndex] < ary[j]) {
               selectIndex = j; //每轮内层循环得到最小值的 index
           }
       }
       if (selectIndex != i) {
           Util.swap(ary, selectIndex, i); //从后向前置换
       }
//            System.out.println(Arrays.toString(ary));
   }

   System.out.println("total time:" + ((System.nanoTime() - startTime) / 1.0e9));
}

与冒泡排序的性能(时间消耗)比较

  • 同样数量级的完全逆序序列
    明显优于冒泡排序
  • 完全随机序列
    优于大部分的冒泡排序实现;比最优的冒泡排序实现略差
相关推荐
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页