选择排序 selection sort
时间复杂度 O ( n 2 ) O(n^2) O(n2)
选择排序每一趟找出一个最小(或最大)数放到序列起始位置,然后再从剩余待排序元素中继续找到最小(或最大)数,放到已排序的序列的尾部,以此类推,直到全部待排序元素排完。
选择排序的思想和冒泡排序是类似的,但选择排序和冒泡排序是有区别的1:
- 冒泡排序比较的是相邻两个数,而选择排序是顺序比较,找到最小(或最大)数。
- 冒泡排序每一轮的比较过程中,位置不对都要换,选择排序每轮比较只是找出最小(或最大)数的索引, 一轮查完后只换一次位置即可。
- 冒泡排序是稳定的(算法是否稳定见后面补充内容),因为当比较相邻两者时如果是一样的,那么不会调换位置,但是选择排序是不稳定的(同见补充内容)。
选择排序和冒泡排序的优劣:
- 选择排序由于一次只交换一次,所以比冒泡排序效率高些,但两者的总体时间复杂度都是 O ( n 2 ) O(n^2) O(n2),所以实际上我估计也快不到哪里去。
- 选择排序需要额外使用一个临时空间。
- 选择排序是不稳定的,但是冒泡排序是稳定的。
选择排序的C语言实现
void swap_arr(int arr[], int i, int j)
{
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void selction_sort(int arr[], int len)
{
int i, j;
int smallest_index;
for(i = 0; i < len; i++)
{
smallest_index = i;
for(j = i+1; j < len; j++)
{
if(arr[j] < arr[smallest_index])
{
smallest_index = j;
}
}
swap_arr(arr, smallest_index, i);
}
}
补充内容
算法是否稳定的判断标准:待排序的序列中有两个相等元素,排序后它们的顺序不变,为算法是稳定的,否则为算法不稳定。比如原序列中有两个相同的值: A i = A j A_i=A_j Ai=Aj, i , j i,j i,j为索引下标,且 i < j i<j i<j,那么排序后还是 i < j i<j i<j。
下面来看选择排序为什么是不稳定的。假如有一个序列: 3 , 2 , 3 , 1 , 4 3,2,3,1,4 3,2,3,1,4。该序列有两个3,第一趟排序,会交换第1个3和1的位置,这样排序后两个3的顺序就和原来就不一样了,所以选择排序是不稳定排序。
既然算法有稳定和不稳定之分,那么稳定的算法有什么好处呢?如果排序算法是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用,这样可减少开销,说基数排序就是这样的2,但是基数排序目前还没去研究,等哪天研究到了,再结合算法的稳定性做总结。