直接选择排序
动态图来自:https://blog.csdn.net/sds15732622190/article/details/52903687
基本思想:
- 第一趟:从第一个元素开始,将后面n-1个元素进行比较,记录其中最小元素的下标,然后将标记的最小的元素和第一个元素进行交换;
- 第二趟:从第二个元素开始,将后面n-2个元素进行比较,记录其中最小元素的下标,然后将标记的最小的元素和第一个元素进行交换;
- ...........
- 第 i 趟:从第 i 个元素开始,将后面n-i个元素进行比较,记录其中最小元素的下标,然后将标记的最小的元素和第 i 个元素进行交换;
- 以此类推,经过n-1趟比较,将n-1个元素排序,剩下一个最大元素直接排在最后;
复杂度和稳定性情况:
- 最好的时间复杂度:O(n²)
- 最坏的时间复杂度:O(n²)
- 平均的时间复杂度:O(n²)
- 空间复杂度:O(1)
- 稳定性:不稳定
C实现代码如下:
#include<stdio.h>
void SelectSort(int a[], int n)
{
int i, j, temp, small;
for (i = 0; i < n - 1; ++i)
{
small = i; //假设第i个元素最小
for (j = i + 1; j < n; ++j) //寻找最小的元素
{
if(a[small] > a[j])
{
small = j; //标记最小元素的下标
}
}
if(small != i) //当最小元素下标不为i时,
{ //将第i个元素和最小的元素交换位置
temp = a[i];
a[i] = a[small];
a[small] = temp;
}
}
}
//测试
int main()
{
int arr[] = {6,5,3,1,8,7,2,4};
int n = sizeof(arr)/sizeof(arr[0]);
SelectSort(arr,n);
for(int i = 0; i < n; ++i)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
其他排序算法: