1.基本思想:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的 数据元素排完 。
2.上图解释
3.进入正题,敲代码
void Print(int *src, int n)
{
for (int i = 0; i<n; i++)
{
printf("%d ", src[i]);
}
putchar('\n');
}
void Swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void SelectionSort(int *src, int n)
{
int i, j;
int min;
for (i = 0; i < n - 1; i++)//外层循环只循环n-1次,前n-1个元素排好整个数组就完成了
{
min = i;//min记录即将要排序的元素坐标
for (j = i + 1; j < n; j++)//内从循环坐标为i+1个元素开始直至最后一个元素
{
if (src[min] > src[j])//从未排序元素中查找最小的元素用min记录他的坐标
{
min = j;
}
}
if (src[i] > src[min])
{
Swap(&src[i], &src[min]);//找到未排序元素中的最小值与它交换
}
}
}
int main()
{
int src[] = { 10, 9, 3,4, 6, 7, 2, 8, 1, 5};
int n = sizeof(src) / sizeof(src[0]);
SelectionSort(src, n);
Print(src, n);
return 0;
}
4.直接选择排序的特性总结:
- 直接选择排序思考非常好理解,但是效率不是很好。实际中很用
- 时间复杂度:O(N^2)
- 空间复杂度:O(1)
- 稳定性:不稳定