C++选择排序原理

一、算法核心步骤

  1. 初始化:将整个数组分为 有序区(空)和 无序区(全部元素)
  2. 查找最小值:在无序区中找到最小值的索引
  3. 交换位置:将找到的最小元素和无序区的第一个元素交换
  4. 缩小范围:有序区扩大一个元素,无序区缩小一个元素
  5. 重复执行:重复步骤2-4直到无序区只剩一个元素

二、C++实现模版

#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]);           
    }
}

int main() {
    int arr[] = {64, 25, 12, 22, 11};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    selectionSort(arr, n);
    
    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

代码关键点:

代码段 作用说明
for (int i = 0; i < n -1; i++) 控制有序区的边界,每次循环后有序区增加一个元素
int minIndex = i 初始化最小值为无序区第一个元素
j = i + 1 内层循环跳过已排序部分,仅扫描无序区
swap(arr[i], arr[minIndex]) 将找到的最小元素与无序区首元素交换,完成一次排

三、算法分析

特性 说明
时间复杂度 O(n²)(无论数据是否有序,都需要完整比较)
空间复杂度 O(1)(原地排序,不需要额外存储空间)
稳定性 不稳定(相同元素的相对位置可能改变)
最佳适用场景 小规模数据 / 需要减少交换次数的场景

四、可视化

初始状态:|64  25  12  22  11
第1轮:  11 |25  12  22  64
第2轮:  11  12 |25  22  64
第3轮:  11  12  22 |25  64
第4轮:  11  12  22  25 |64

五、优化方向

  1. 同时找最大最小值:每次遍历同时找最小和最大值,减少循环次数
  2. 递归实现:通过递归处理剩余无序区
  3. 适应性改进:检测是否已有序时提前终止循环
posted @ 2025-05-14 11:00  洛弗尔  阅读(39)  评论(0)    收藏  举报