选择排序(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 }

浙公网安备 33010602011771号