选择排序(java)

原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。

arr={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}

 

第一趟排序: 原始数据:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48

最小数据2,把2放在首位,也就是2和3互换位置,

排序结果:2,44,38,5,47,15,36,26,27,3,46,4,19,50,48

第二趟排序:

第2以外的数据{44,38,5,47,15,36,26,27,3,46,4,19,50,48}进行比较,3最小,

排序结果:2,3,38,5,47,15,36,26,27,44,46,4,19,50,48

第三趟排序:

除2、3以外的数据{38,5,47,15,36,26,27,44,46,4,19,50,48}进行比较,4最小,38和4交换

排序结果:2,3,4,5,47,15,36,26,27,44,46,3819,50,48

依次进行排序

动态图如下图所示

选择排序的时间复杂度:简单选择排序的比较次数与序列的初始排序无关。 假设待排序的序列有 N 个元素,则比较次数永远都是N (N - 1) / 2。而移动次数与序列的初始排序有关。当序列正序时,移动次数最少,为 0。当序列反序时,移动次数最多,为3N (N - 1) 。

所以,综上,简单排序的时间复杂度为 O(N2)

不稳定的排序算法。

代码如下

 1 package sort;
 2 
 3 //选择排序
 4 public class SelectionSort {
 5   public static void main(String[] args) {
 6       int[] arr={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
 7       System.out.println("交换之前:");
 8       for(int num:arr){
 9           System.out.print(num+" ");
10       }        
11       //选择排序的优化
12       for(int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
13           int k = i;
14           for(int j = k + 1; j < arr.length; j++){// 选最小的记录
15               if(arr[j] < arr[k]){ 
16                   k = j; //记下目前找到的最小值所在的位置
17               }
18           }
19           //在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
20           if(i != k){  //交换a[i]和a[k]
21               int temp = arr[i];
22               arr[i] = arr[k];
23               arr[k] = temp;
24           }    
25       }
26       System.out.println();
27       System.out.println("交换后:");
28       for(int num:arr){
29           System.out.print(num+" ");
30       }
31   }
32 
33 }

 

posted @ 2020-08-19 19:42  兔奶糖  阅读(259)  评论(0)    收藏  举报