野牛程序员讲少儿编程之选择排序(C++)—— 一步步带孩子学排序!
作者:野牛程序员:2025-03-14 12:08:35C++阅读 2068
野牛程序员讲少儿编程之选择排序(C++)—— 一步步带孩子学排序!
🎯 野牛程序员讲少儿编程之选择排序(C++)—— 一步步带孩子学排序!
💡 选择排序(Selection Sort)是一种简单但很重要的排序算法,适合孩子们入门 C++ 编程。今天就来用最通俗易懂的方式,把它讲清楚!
🌟 什么是选择排序?
选择排序(Selection Sort)是一种 每次找到最小(或最大)元素,并放到正确位置 的排序方法。
✅ 核心思想:
从未排序部分找到最小的元素
把最小元素和当前位置的元素交换
重复这个过程,直到排序完成
✅ 时间复杂度:
最坏情况(倒序):
O(n²)
最好情况(已经排好序):
O(n²)
平均情况:
O(n²)
✅ 适合孩子理解的比喻: 想象一下,现在有一群小朋友排队,要按 身高从矮到高 排列。选择排序的方式就像这样:
先找出 最矮的,把他放到第一位
再从剩下的孩子里找 第二矮的,放到第二位
依次重复,直到所有孩子都按身高排好
🚀 野牛程序员C++ 代码实现
🔹 版本 1:基础版
#include <iostream> using namespace std; void selectionSort(int arr[], int n) { 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; // 找到更小的元素 } } // 交换最小元素到当前位置 swap(arr[i], arr[minIndex]); } } // 打印数组 void printArray(int arr[], int n) { for (int i = 0; i < n; i++) { cout << arr[i] << " "; } cout << endl; } int main() { int arr[] = {64, 25, 12, 22, 11}; int n = sizeof(arr) / sizeof(arr[0]); cout << "排序前: "; printArray(arr, n); selectionSort(arr, n); cout << "排序后: "; printArray(arr, n); return 0; }
🔹 输出:
排序前: 64 25 12 22 11 排序后: 11 12 22 25 64
📌 野牛程序员代码解析
1️⃣ selectionSort()
排序函数
void selectionSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { // 遍历 n-1 次 int minIndex = i; // 假设当前索引 i 是最小值 for (int j = i + 1; j < n; j++) { // 在剩余数组中寻找更小的值 if (arr[j] < arr[minIndex]) { // 发现更小的值 minIndex = j; } } swap(arr[i], arr[minIndex]); // 交换当前索引 i 和最小索引 minIndex 的值 } }
✅ 外层循环:遍历数组 n-1
次,每次选出一个最小值
✅ 内层循环:在未排序部分寻找最小值
✅ swap(arr[i], arr[minIndex])
:交换当前元素和找到的最小值
🔥 选择排序的可视化
轮次 | 数组状态 | 说明 |
---|---|---|
初始 | 64, 25, 12, 22, 11 | 初始数组 |
第 1 轮 | 11, 25, 12, 22, 64 | 找到 11(最小),和 64 交换 |
第 2 轮 | 11, 12, 25, 22, 64 | 找到 12(最小),和 25 交换 |
第 3 轮 | 11, 12, 22, 25, 64 | 找到 22(最小),和 25 交换 |
第 4 轮 | 11, 12, 22, 25, 64 | 25 已经是最小值,不用换 |
结束 | 11, 12, 22, 25, 64 | 排序完成 ✅ |
🌟 野牛程序员讲版本 2:改进版(降序排序)
如果想按 从大到小 排序,只需要把 <
变成 >
:
if (arr[j] > arr[minIndex]) { // 找到更大的值 minIndex = j; }
完整代码:
#include <iostream> using namespace std; void selectionSortDescending(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int maxIndex = i; for (int j = i + 1; j < n; j++) { if (arr[j] > arr[maxIndex]) { maxIndex = j; } } swap(arr[i], arr[maxIndex]); } } // 打印数组 void printArray(int arr[], int n) { for (int i = 0; i < n; i++) { cout << arr[i] << " "; } cout << endl; } int main() { int arr[] = {64, 25, 12, 22, 11}; int n = sizeof(arr) / sizeof(arr[0]); cout << "排序前: "; printArray(arr, n); selectionSortDescending(arr, n); cout << "排序后: "; printArray(arr, n); return 0; }
🔹 排序结果(降序):
排序后: 64 25 22 12 11
💡 野牛程序员讲选择排序的优缺点
✅ 优点
逻辑简单,容易理解
不需要额外的存储空间(原地排序)
适用于小规模数据排序
❌ 缺点
效率较低,即使数组本来是有序的,还是要比较
n²
次不稳定排序,相同值的相对顺序可能改变
🎯 野牛程序员总结
选择排序虽然简单,但非常适合少儿编程的入门!
核心概念:找到最小值,换到前面
时间复杂度:
O(n²)
适用场景:小规模数据,帮助孩子理解排序逻辑
💡 练习小挑战:
试着改成降序排序
尝试用
vector<int>
代替数组让孩子自己在纸上手动模拟一次选择排序
🚀 排序只是编程的开始,未来还能探索更快的排序方法,比如 快速排序(Quick Sort)
! 💪
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
