1.动画展示
2.思路分析
- 第一个跟后面的所有数相比,如果小于(或大于)第一个数的时候,暂存较小数的下标,第一趟结束后,将第一个数,与暂存的那个最小数进行交换,第一个数就是最小(或最大的数)
- 下标移到第二位,第二个数跟后面的所有数相比,一趟下来,确定第二小(或第二大)的数
重复以上步骤
直到指针移到倒数第二位,确定倒数第二小(或倒数第二大)的数,那么最后一位也就确定了,排序完成。

3.复杂度分析
- 不管原始数组是否有序,时间复杂度都是O(n^2),
因为每一个数都要与其他数比较一次,(n-1)^2次,分解:n^2-2n+1, 去掉低次幂和常数,剩下n^2,所以最后的时间复杂度是O(n^2)。
- 空间复杂度是O(1),因为只定义了两个辅助变量,与n的大小无关,所以空间复杂度为O(1)。
4.代码实现
最近看的,较容易理解public static void Select(int[] arr){//跟冒泡一样第一轮:同样只需要比较长度-1次for (int i = 0; i < arr.length-1; i++) {//i代表每轮选择最小元素要交换到的目标索引int s = i;//代表最小元素的索引,// 一开始认定一开始为i,后面找打更小的再更新sfor (int j = i+1; j <arr.length ; j++) {if (arr[j]<arr[s]){s=j;}}if (s!=i){swap(arr,s,i);}System.out.println(Arrays.toString(arr));}}
public class SelectSort {public static void main(String[] args) {int arr[] = {6,7,9,5,2};System.out.println("排序前");System.out.println(Arrays.toString(arr));selectSort(arr);System.out.println("排序后");System.out.println(Arrays.toString(arr));}public static void selectSort(int[] arr){/*** 思路:假设第一个值为最小值,每一轮排序,最小值后面的数与该轮最小值的数进行比较,* 如果后面有比这个值还要小,则改变这个设定的最小值为这个值,并交换两个值的索引位置,进而交换两个值的位置。*/for (int i = 0; i <arr.length ; i++) {//arr[i]为每轮设定的最小值int minIndex = i; //假设第一个值为最小值iint 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;}}}}
推导过程
//使用逐步推导的方式来,讲解选择排序//第1轮//原始的数组 : 101, 34, 119, 1//第一轮排序 : 1, 34, 119, 101//算法 先简单--》 做复杂, 就是可以把一个复杂的算法,拆分成简单的问题-》逐步解决//第1轮int minIndex = 0;int min = arr[0];for(int j = 0 + 1; j < arr.length; j++) {if (min > arr[j]) { //说明假定的最小值,并不是最小min = arr[j]; //重置minminIndex = j; //重置minIndex}}//将最小值,放在arr[0], 即交换if(minIndex != 0) {arr[minIndex] = arr[0];arr[0] = min;}System.out.println("第1轮后~~");System.out.println(Arrays.toString(arr));// 1, 34, 119, 101//第2轮minIndex = 1;min = arr[1];for (int j = 1 + 1; j < arr.length; j++) {if (min > arr[j]) { // 说明假定的最小值,并不是最小min = arr[j]; // 重置minminIndex = j; // 重置minIndex}}// 将最小值,放在arr[0], 即交换if(minIndex != 1) {arr[minIndex] = arr[1];arr[1] = min;}System.out.println("第2轮后~~");System.out.println(Arrays.toString(arr));// 1, 34, 119, 101//第3轮minIndex = 2;min = arr[2];for (int j = 2 + 1; j < arr.length; j++) {if (min > arr[j]) { // 说明假定的最小值,并不是最小min = arr[j]; // 重置minminIndex = j; // 重置minIndex}}// 将最小值,放在arr[0], 即交换if (minIndex != 2) {arr[minIndex] = arr[2];arr[2] = min;}System.out.println("第3轮后~~");System.out.println(Arrays.toString(arr));// 1, 34, 101, 119 */
代码2
public static void selectionSort(int[] array) {if (array == null || array.length <= 1) {return;}int length = array.length;for (int i = 0; i < length - 1; i++) {// 保存最小数的索引int minIndex = i;for (int j = i + 1; j < length; j++) {// 找到最小的数if (array[j] < array[minIndex]) {minIndex = j;}}// 交换元素位置if (i != minIndex) {swap(array, minIndex, i);}}}private static void swap(int[] array, int a, int b) {int temp = array[a];array[a] = array[b];array[b] = temp;}}
5.选择排序与冒泡排序的比较
- 时间负责度都是O(n2)
- 空间复杂度都是O(1)
- 选择排序是从第一位开始确定最大或最小的数,保证前面的数都是有序的,且都比后面的数小或大;
冒泡排序是从最后一位开始确定最大或最小的数,保证后面的数都是有序的且都大于或小于前面的数。
