参考:
《2022 年数据结构考研复习指导》王道论坛
https://www.bilibili.com/video/BV1Eb41147dK?from=search&seid=7630499509795698118
https://baike.baidu.com/item/%E5%A0%86%E6%8E%92%E5%BA%8F/2840151?fr=aladdin
https://baike.baidu.com/item/%E5%A0%86/20606834?fr=aladdin
一,选择排序
0,有序区
有序区:数组中已经排序好的连续区间。
1,算法思想(升序)
将有序区设在数组的开头 / 末尾,然后从无序区中选择一个最小值 / 最大值,交换到无区序的第一个元素 / 最后一个元素,作为新选择出来的元素添加到有序区。一直循环到无序区为空。
2,算法步骤(有序区在数组末尾)
① 用 i 从数组末尾向前遍历 n- 1 个元素。
从数组末尾向前遍历是因为:
有序区是在数组末尾,接下来找到的最大值是要交换到无序区的最后一个元素,从后往前遍历的话,i 就可以代表无序区的最后一个元素下标,直接进行交换。
遍历 n-1 个元素是因为:
只要要排序好 n-1 个数,剩下的一个数也就是有序的。
3,代码
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 110 int a[N]; void swap(int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } void selectSort(int n) // 升序的选择排序 { for (int i = n - 1; i > 0; i--) { int k = 0; // 0~i 的最大值的下标 for (int j = 1; j <= i; j++) if (a[j] > a[k]) k = j; swap(i, k); } } int main(void) { int n; while (scanf("%d", &n) != EOF) { for (int i = 0; i < n; i++) scanf("%d", &a[i]); selectSort(n); for (int i = 0; i < n; i++) printf("%d ", a[i]); puts(""); } system("pause"); return 0; }