简单选择排序
简单选择排序的思想就是将未排序的子序列中最小的值(或者最大的值)排列到已经排好序的子序列后面
- 设置两层循环,第一层循环是遍历已经排好序的子序列,每次都指向该子序列的最后一个元素
- 第二层序列用来遍历后面没有排好序的序列,每次循环,都找到最小或者最大的元素,然后放到已经排好序的子序列后面
- 第一层循环从第一个元素开始,到第
len - 1
个元素结束,因为最后一个元素一定是最值元素 - 第二层循环从已经排好序的序列的后一个元素开始,到第
len
个元素位置结束,因为要遍历整个无序子序列
算法分析
- 时间复杂度:
- 最好的情况是正序,不需要移动;最坏的情况就是逆序,移动
3(n-1)
次 - 无论记录的初始排序如何,需要进行比较次数都是相同的,所以简单选择排序的时间复杂度是
O(n^2)
- 最好的情况是正序,不需要移动;最坏的情况就是逆序,移动
- 空间复杂度:
- 只有两个记录交换时需要一个辅助空间,所以空间复杂度为
O(1)
- 只有两个记录交换时需要一个辅助空间,所以空间复杂度为
特点
- 就选择排序本身来说,它是一种
稳定排序
- 可以用于链式结构
- 移动记录比较少,当一个记录占用空间比较多时,这个方法比直接插入排序来的快
C语言实现
/**
* 简单选择排序
*/
void selectSort(int arr[],int len)
{
for (int i = 0; i < len - 1;i++){
int min = i;
for (int j = i + 1; j < len;j++){
if(arr[j] < arr[min])
min = j;
}
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}