题目:
[编程入门]选择排序 - C语言网 (dotcpp.com)
算法分析:
1.我们设置两个记录i和j,i自数组第一个元素开始,j自i+1个元素开始。其中i是控制外层的趟数,j是控制内层对比的次数。
2.接着j遍历整个数组,如果选出了一个比当前数大的较小值,则更新较小值,直到选出整个数组最小的值,并让这个最小的值和i的位置交换(在第一趟中假设数组第一个数是最小值也就是arr[0]在当前循环中就是arr[i],如果i选择的元素是最小的则不需要交换),我们称这个过程为一趟选择排序。
3.i选中下一个元素(i++),在下一趟中arr[0]不用参加排序,从arr[1]开始即可。重复进行每一趟选择排序。
4.持续上述步骤,使得i到达n-1处,即完成排序 。
图示示例:
第一趟2就是需要比较的数,往后遍历发现1比2小二者交换,然后从10开始往后遍历发现2比10小二者交换以此类推。直到最后一趟9比10小不用交换,因此外层控制趟数的i就是n-1次,内层j因为每次都要以此往后遍历n次寻找小的数。
代码:
每一趟从待排序的数据元素中选出最小的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完,我们只需要进行n-1趟排序即可,因为最后剩下的一个数据一定是整体数据中最大的数据。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
// 选择排序
int main() {
int arr[100];
int n;
// 输入数组长度
scanf("%d", &n);
// 读取数组元素
int i;
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 选择排序
for (i = 0; i < n - 1; i++) {
int j, min = i;
// 找到未排序部分的最小元素
for (j = i + 1; j < n; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
// 交换元素
if (min != i) {
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
// 打印排序后的数组
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
样例输入
10(是10个数据)
4 85 3 234 45 345 345 122 30 12
样例输出
复杂度与稳定性
算法时间复杂度
最坏情况:O(n^2)
最好情况:O(1)(即不需要排序,本身已是正序)
平均情况:O(n^2)
空间复杂度:S(n)=O(1)
稳定性:不稳定排序