选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到 排序的目的。
选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从 arr[0]~arr[n-1]中选取最小值, 与 arr[0]交换,第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换,第三次从 arr[2]~arr[n-1]中选取最小值,与 arr[2] 交换,…,第 i 次从 arr[i-1]~arr[n-1]中选取最小值,与 arr[i-1]交换,…, 第 n-1 次从 arr[n-2]~arr[n-1]中选取最小值, 与 arr[n-2]交换,总共通过 n-1 次,得到一个按排序码从小到大排列的有序序列。
对一个数组的选择排序再进行讲解
选择排序的过程演示:
public static void main(String[] args) { int arr[] = new int[]{101,34,119,1}; System.out.println("排序前"); System.out.println(Arrays.toString(arr)); selectSort(arr); } public static void selectSort(int[] arr){ //第1轮 //原始数组: 101,34,119,1 //第一轮排序: 1,34,119,101 int minIndex = 0; //先假定最小值的数组索引是0; int min = arr[0]; //假定数组的第一个元素是最小值 for (int j = 0+1;j<arr.length;j++){ if (min > arr[j]){ //说明假定的最小值 并不是最小 min = arr[j]; //重置最小值 minIndex = j; //重置最小值的下标 } } //将最小值,放在arr[0],即交换 if (minIndex!=0){ arr[minIndex] = arr[0]; arr[0] = min; } System.out.println("第一轮后"); System.out.println(Arrays.toString(arr)); //第二轮排序:第一个最小值已经确定 minIndex = 1; //由于第一轮已经把最小值确定,并放在第[0]位,所以第二轮假定最小值的数组索引是1; min = arr[1]; //假定数组的第二个元素是最小值 for (int j = 2;j<arr.length;j++){ if (min > arr[j]){ //说明假定的最小值 并不是最小 min = arr[j]; //重置最小值 minIndex = j; //重置最小值的下标 } } //将最小值,放在arr[1],即交换 if (minIndex!=1){ arr[minIndex] = arr[1]; arr[1] = min; } System.out.println("第二轮后"); System.out.println(Arrays.toString(arr)); //第三轮:前两个元素已经确定 minIndex = 2; //第三轮假定最小值的数组索引是2; min = arr[2]; //假定数组的第三个元素是最小值 for (int j = 3;j<arr.length;j++){ if (min > arr[j]){ //说明假定的最小值 并不是最小 min = arr[j]; //重置最小值 minIndex = j; //重置最小值的下标 } } //将最小值,放在arr[2],即交换 if (minIndex!=2){ arr[minIndex] = arr[2]; arr[2] = min; } System.out.println("第三轮后"); System.out.println(Arrays.toString(arr)); }运行结果:
排序前 [101, 34, 119, 1] 第一轮后 [1, 34, 119, 101] 第二轮后 [1, 34, 119, 101] 第三轮后 [1, 34, 101, 119]实现选择排序:
public static void main(String[] args) { int arr[] = new int[]{101,34,119,1,20}; System.out.println("排序前"+Arrays.toString(arr)); System.out.println(); selectSort(arr); } public static void selectSort(int[] arr){ for (int i=0;i<arr.length-1;i++){ int minIndex = i; //先假定最小值的数组索引是0; int min = arr[i]; //假定数组的第一个元素是最小值 for (int j = i+1;j<arr.length;j++){ //第一个数已经假定是最小值,所以从第二个数开始遍历 if (min > arr[j]){ //说明假定的最小值 并不是最小 min = arr[j]; minIndex = j; } } if (minIndex!=i){ arr[minIndex] = arr[i];//交换 arr[i] = min; //交换 } System.out.println("第"+(i+1)+"轮排序后"+Arrays.toString(arr)); } }运行结果:
排序前[101, 34, 119, 1, 20] 第1轮排序后[1, 34, 119, 101, 20] 第2轮排序后[1, 20, 119, 101, 34] 第3轮排序后[1, 20, 34, 101, 119] 第4轮排序后[1, 20, 34, 101, 119]选择排序(select sort):每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
区别在于:在交换的方式上
冒泡算法,每次比较如果发现较小zhi的元素在后面,就交换两个相邻的元素。
而选择排序算法的改进在于:先并不急于调换位置,先从A[1]开始逐个检查,看哪个数最小就记下该数所在的位置P,等一躺扫描完毕,再把A[P]和A[1]对调,这时A[1]到A[10]中最小的数据就换到了最前面的位置。
所以,选择排序每扫描一遍数组,只需要一次真正的交换,而冒泡可能需要很多次。比较的次数一样的。