选择排序
-
基本思想
基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完;
-
图片说明
如上图所示:在数组{7,4,5,9,8,2,1}中进行选择排序
- 一次选两个数,最小的放第一个位置,最大的放最后一个位置
- 在元素集合中选择关键码最小(大)的数据元素;
- 若它不是这组元素中的第一个(最后一个)元素,则将它与这组元素中的第一个(最后一个)元素交换;
- 在剩余的元素集合中,重复上述步骤,直到集合剩余1个元素;
-
代码实现
#include<stdio.h> #include<stdlib.h> void Swap(int* p1, int* p2) { int tmp = *p1; *p1 = *p2; *p2 = tmp; } void SelectSort(int* a, int n) { int begin = 0, end = n - 1; while (begin < end) { int max = end, min = begin; for (int i = begin; i <= end; i++)//遍历找出最大值和最小值的下标 { if (a[i] > a[max]) max = i; if (a[i] < a[min]) min = i; } Swap(&a[max], &a[end]); if (a[max] >a[min])//防止最小数换到了下标为max的位置上 { Swap(&a[min], &a[begin]); } ++begin; --end; } } int main() { int a[] = { 9, 2, 3, 4, 8, 4, 1, 7, 5, 6 }; SelectSort(a, sizeof(a) / sizeof(int)); for (int i = 0; i < sizeof(a) / sizeof(int); i++) { printf("%d ", a[i]); } system("pause"); return 0; }
-
特性总结
-
直接选择排序好理解,但效率不是很好。实际中很少使用;
-
时间复杂度:O(N^2)
-
空间复杂度:O(1)
-
稳定性:不稳定
-
选择排序无论什么情况都需要比较O(N^2)次;