Day7C语言前期阶段算法之选择排序
选择排序的基本思想
核心概念:每次从待排序的数据中找出最小(或最大)的元素,放到已排序序列的末尾。
比喻理解:
就像整理一副扑克牌:
-
从所有牌中找出最小的,放在最左边
-
从剩下的牌中再找出最小的,放在刚才那张的右边
-
重复直到所有牌都排好
排序过程:
初始: [64, 25, 12, 22, 11]
第1轮:
-
在[64,25,12,22,11]中找到最小值11
-
交换64和11 → [11, 25, 12, 22, 64]
第2轮:
-
在[25,12,22,64]中找到最小值12
-
交换25和12 → [11, 12, 25, 22, 64]
第3轮:
-
在[25,22,64]中找到最小值22
-
交换25和22 → [11, 12, 22, 25, 64]
第4轮:
-
在[25,64]中找到最小值25(已在正确位置)
-
无需交换 → [11, 12, 22, 25, 64]
最终: [11, 12, 22, 25, 64]
#include <stdio.h>// 选择排序函数
void selectionSort(int arr[], int n) {int i, j, min_index, temp;// 外层循环:控制排序的轮数,每轮确定一个最小元素的位置for (i = 0; i < n - 1; i++) {// 假设当前轮次的第一个元素是最小的min_index = i;// 内层循环:在未排序部分中寻找真正的最小元素for (j = i + 1; j < n; j++) {// 如果找到更小的元素,更新最小元素的索引if (arr[j] < arr[min_index]) {min_index = j;}}// 将找到的最小元素与当前轮次的第一个元素交换if (min_index != i) {temp = arr[i];arr[i] = arr[min_index];arr[min_index] = temp;}// 可选:打印每轮排序后的数组状态,便于理解printf("第%d轮排序后: ", i + 1);for (int k = 0; k < n; k++) {printf("%d ", arr[k]);}printf("\n");}
}// 打印数组函数
void printArray(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr) / sizeof(arr[0]);printf("=== 选择排序演示 ===\n");printf("原始数组: ");printArray(arr, n);printf("\n");// 调用选择排序函数selectionSort(arr, n);printf("\n排序后的数组: ");printArray(arr, n);return 0;
}