选择排序-算法及优化

前言

前面我们介绍了一种经典的排序算法——冒泡排序。通过依次比较、交换相邻元素,使最大值浮到数组末端。今天我们介绍另一种经典的排序算法:选择排序。

用数组的第一个元素与后面的元素进行比较,如果有更小值则互换。再用交换后得到的更小的值继续与之后的元素进行比较,直到该位置的元素是整个数组的最小值。以此类推,使下一个位置的元素是数组剩余元素中的最小值,直到所有元素排列完毕。这就是选择排序大致的实现过程。

代码

public static void main(String[] args) {
        int [] arry = {3,7,2,9,5,6,4,2,1,5};
        for (int i = 0; i < arry.length-1; i++) {   
        //i控制基准位置,i = 0即从数组首位开始依次确定元素
             for(int j = i+1 ;j < arry.length ;j++){
                 if(arry[j]>arry[i]){                //小于基准位置的值则交换
                     int temp = arry[i];
                     arry[i] = arry[j];
                     arry[j] = temp ;
                 }
             }
        }
}

当然,也可以从数组末位开始确定元素。

public static void main(String[] args) {
        int [] arry1 = {5,8,4,5,7,7,5,6,2,9};
        for (int i = arry1.length-1; i > 0; i--) {  
        //i控制基准位置,i = 数组长度-1即从数组末尾开始依次确实元素
            for(int j = i-1;j>=0;j--){  
                if(arry1[j]>arry1[i]){            //大于基准位置的值则交换
                    int temp = arry1[i];
                    arry1[i] = arry1[j];
                    arry1[j] = temp;
                }
            }
       }
}

优化

上述的选择排序仍然没有避免像冒泡排序一样,进行了频繁的交换。实际上,完全不需要进行过多的交换。确定基准位置后,只需直接找到数组剩余元素的最小值,然后再和基准位置进行交换即可 ,如此一来,针对每个位置只需要进行一次交换。

优化后的代码如下:

public static void main(String[] args) {
int [] arry2 ={5,7,8,6,8,9,1,5,7,6,3,4} ;
        for (int i = 0; i < arry2.length-1; i++) {
            int minIndex = i;                   //假设基准位置是最小值
            for (int j = i+1;j < arry2.length;j++){
                if(arry2[j]<arry2[minIndex]){   //找出剩余元素中的最小值的索引
                    minIndex = j;
                }
            }
            int temp  = arry2[i];               //交换最小值和基准位置的值
            arry2[i] = arry2[minIndex];
            arry2[minIndex] = temp ;
        }
}
posted @ 2021-04-28 22:17  Ji_Lei  阅读(309)  评论(0编辑  收藏  举报