排序思想:
升序排序:每次从待排序序列中找出一个最小值与第一个待排序序列中的第一个数交换
降序排列:每次从待排序序列中找出一个最大值与第一个待排序序列中的第一个数交换
举例说明:
蓝色背景为待排序序列
待排序序列 | 8,1,3,7,9,5,6 |
第一趟排序 | 1,8,3,7,9,5,6 |
第二趟排序 | 1,3,8,7,9,5,6 |
第三趟排序 | 1,3,5,7,9,8,6 |
第四趟排序 | 1,3,5,6,9,8,7 |
第五趟排序 | 1,3,5,6,7,8,9 |
第六趟排序 | 1,3,5,6,7,8,9 |
七个数据需要交换六次,所以需要跑len-1次
代码实现:
void SelectSort(int* ar, int len)
{
assert(ar != nullptr);
for (int i = 0; i < len - 1; ++i)
{
int min = ar[i];//保存待排序序列中的第一个数据
int tmp = i; //保存待排序序列中第一个元素的下标
for (int j = i+1; j < len; ++j)//每次从待排序序列中选择最小的
{
if (ar[j] < min)
{
min = ar[j];
tmp = j;
}
}
int tmp1 = ar[i];
ar[i] = ar[tmp];
ar[tmp] = tmp1;//将找到的最小值与待排序序列第一个数据交换
}
}
int main()
{
int ar[] = { 34,45,98,10,4,64,83,49,20,39 };
int len = sizeof(ar)/sizeof(ar[0]);
//InsertSort(ar, len);
//QuickSort(ar, 0, len - 1);
SelectSort(ar, len);
My_print(ar, len);
return 0;
}
分析:
- 稳定性:因为不存在跳跃交换,所以这个算法是稳定的
- 时间复杂度:两个for循环嵌套,所以时间复杂度为O(n*n)
- 空间复杂度:用了三个临时变量,是常数级别,所以时间复杂度为O(1)