基础算法-选择排序

📅 2026/7/13 9:59:58
基础算法-选择排序
选择排序 (Selection Sort)像“选班长”一样每次从剩下没排好序的队伍里挑出最矮(最小)的那个人直接让他站到队伍的最前面。然后从剩下的人里再挑最矮的站到第二的位置。一直挑到最后队伍就排好序了。核心代码#include stdio.h // 选择排序函数 void selectionSort(int arr[], int n) { // 外层循环控制排序的轮数n个元素需要n-1轮 for (int i 0; i n - 1; i) { int minIndex i; // 假设当前未排序部分的第一个元素是最小的 // 内层循环在未排序部分中寻找真正的最小值 for (int j i 1; j n; j) { if (arr[j] arr[minIndex]) { minIndex j; // 发现更小的元素更新最小值的下标 } } // 如果找到的最小值不在当前位置则进行交换 if (minIndex ! i) { int temp arr[i]; arr[i] arr[minIndex]; arr[minIndex] temp; } } } // 打印数组的辅助函数 void printArray(int arr[], int n) { for (int i 0; i n; i) { printf(%d , arr[i]); } printf(\n); } int main() { int arr[] {64, 34, 25, 12, 22}; int n sizeof(arr) / sizeof(arr[0]); // 计算数组长度 printf(排序前); printArray(arr, n); selectionSort(arr, n); // 调用选择排序 printf(排序后); printArray(arr, n); return 0; }示例演示{64, 34, 25, 12, 22}第 1 轮寻找整个数组的最小值目标把最小的数“选”出来放到数组的第一个位置。假设第一个元素 64 最小(minIndex 0)。遍历后面的元素34 64更新 minIndex 125 34更新 minIndex 212 25更新 minIndex 322 12不更新。遍历结束找到最小值为 12(下标为 3)。将 12 与第一个元素 64 交换。第 1 轮结束最小值 12 已经归位到最左侧。当前数组[12, 34, 25, 64, 22] (12 为已排好序的部分)第 2 轮寻找剩余元素的最小值目标把第二小的数“选”出来放到第二个位置。从下标 1 开始假设 34 最小(minIndex 1)。遍历后面的元素25 34更新 minIndex 264 25不更新22 25更新 minIndex 4。遍历结束找到最小值为 22(下标为 4)。将 22 与下标 1 的元素 34 交换。第 2 轮结束第二小值 22 归位。当前数组[12, 22, 25, 64, 34]第 3 轮目标把第三小的数归位。从下标 2 开始假设 25 最小(minIndex 2)。遍历后面的元素64 25不更新34 25不更新。遍历结束最小值依然是 25(minIndex 仍为 2)。因为最小值就在原位所以无需交换。第 3 轮结束第三小值 25 归位。当前数组[12, 22, 25, 64, 34]第 4 轮目标把第四小的数归位。从下标 3 开始假设 64 最小(minIndex 3)。遍历后面的元素34 64更新 minIndex 4。遍历结束找到最小值为 34(下标为 4)。将 34 与下标 3 的元素 64 交换。第 4 轮结束排序完成。最终结果[12, 22, 25, 34, 64]复杂度时间复杂度是\(O(n^2)\)(无论最好、最坏还是平均情况比较次数固定)空间复杂度是\(O(1)\)(只需常数级的额外空间用于临时变量交换)