原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。
简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数据,将它与arrr[1]交换;第2趟,在待排序数据arr[2]~arr[n]中选出最小的数据,将它与r[2]交换;以此类推,第i趟在待排序数据arr[i]~arr[n]中选出最小的数据,将它与r[i]交换,直到全部排序完成。
举例:
arr[] = {3,6,2,7,4,1}
--------------------------------------
第一趟: 1最小,与3交换位置 1,6,2,7,4,3
--------------------------------------
第二趟: 2最小,与6交换位置 1,2,6,7,4,3
--------------------------------------
第三趟: 3最小,与6交换位置 1,2,3,7,4,6
--------------------------------------
第四趟: 4最小,与7交换位置 1,2,3,4,7,6
--------------------------------------
第五趟: 6最小,与7交换位置 1,2,3,4,6,7
--------------------------------------
代码思路
分成两个循环:第一次循环选择的是数组遍历,第二次为未排序的数组遍历及比较。
代码实现
package cn.janson.sort;
public class SelectSort {
public static void selectSort(int[] arr) {
//选择排序的优化
for(int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
int k = i;
for(int j = k + 1; j < arr.length; j++){// 选最小的记录
if(arr[j] < arr[k]){
k = j; //记下目前找到的最小值所在的位置
}
}
//在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
if(i != k){ //交换a[i]和a[k]
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
}
public static void main(String[] args) {
int[] arr={3,6,2,7,4,1};
System.out.println("交换之前:");
for(int num:arr){
System.out.print(num+" ");
}
selectSort(arr);
System.out.println();
System.out.println("交换后:");
for(int num:arr){
System.out.print(num+" ");
}
}
}
测试效果
交换之前:
3 6 2 7 4 1
交换后:
1 2 3 4 6 7