选择排序
- 1.1基本思想
- 1.1.1总体思路
- 1.1.2具体思路
- 1.2图示详解
- 1.3完整代码
- 1.4动图演示
- 1.5时间复杂度
- 1.6空间复杂度
1.1基本思想
1.1.1总体思路
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
1.1.2具体思路
①在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素;
②若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换;
③在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。
1.2图示详解
以升序排列为例:
1.3完整代码
/**
* 选择排序
* @param array
*/
public void selectSort(int[] array){
for(int i = 0;i < array.length-1;i++){
int minIndex = i;
for(int j = i+1;j < array.length;j++){
if(array[j] < array[minIndex]){
minIndex = j;
}
}
swap(array,i,minIndex);
}
}
/**
* 交换数组下标i,j处的值
* @param array
* @param i
* @param j
*/
public static void swap(int[] array,int i,int j){
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
1.4动图演示
1.5时间复杂度
假设有n个数据(n >= 2)待排序。当i = 0时,j需要向右遍历(n - 1)次;i = 1时,j需要向右遍历(n - 2)次;依此类推,总的时间复杂度T(n) = (n-1) + (n-2) + …+ 2 + 1 = n * (n-1) / 2。所以整个选择排序算法的时间复杂度为O(n^2)。
1.6空间复杂度
整个排序过程只创建了常数个临时变量,因此空间复杂度为O(1)。