选择排序算法(C++版)

1、什么是选择排序

选择排序(Selection Sort)是一种简单直观的排序算法,它的基本思想是每次从未排序的部分选择一个最小(或最大)的元素,将其与未排序部分的第一个元素交换位置,以此类推,直到整个数组有序。

2、选择排序的基本步骤

  1. 初始状态:将整个序列分为已排序和未排序两部分,初始时已排序部分为空,未排序部分包含所有元素。

  2. 选择最小元素:从未排序部分选择一个最小元素,记录其索引。

  3. 交换位置:将选择的最小元素与未排序部分的第一个元素交换位置。

  4. 更新已排序和未排序部分:将已排序部分扩展一个元素,将未排序部分减少一个元素。

  5. 重复:重复步骤2-4,直到未排序部分为空,整个序列有序。

3、选择排序的适用范围和特点

适用范围

  • 选择排序适用于小规模的数据集,因为其时间复杂度为O(n^2),在大规模数据集上性能相对较差。

特点

  1. 简单直观:选择排序是一种直观易懂的排序算法,适用于教学和小规模数据集的排序。

  2. 不稳定性:选择排序是一种不稳定的排序算法,因为相同元素的相对顺序可能在排序过程中发生改变。

  3. 原地排序:选择排序是一种原地排序算法,不需要额外的内存空间。

  4. 不受输入数据影响:选择排序的时间复杂度在最好、最坏和平均情况下都是O(n^2),与输入数据的初始状态无关。

  5. 交换次数相对较少:选择排序每一轮只需要一次交换,因此交换次数相对较少,适用于对交换次数有限制的场景。

尽管选择排序的性能在大规模数据集上不如一些高级排序算法(例如快速排序、归并排序),但在某些特定场景下,选择排序仍可能是一个合适的选择,尤其是对于小规模或基本有序的数据。

4、选择排序算法示例

c 复制代码
#include <iostream>
#include <vector>

void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

void selectionSort(std::vector<int> &arr) {
    int n = arr.size();

    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(const std::vector<int> &arr) {
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90};

    std::cout << "Unsorted array: ";
    printArray(arr);

    selectionSort(arr);

    std::cout << "Sorted array: ";
    printArray(arr);

    return 0;
}

这个程序中,selectionSort 函数是选择排序的主要函数。在每一轮迭代中,找到未排序部分的最小元素,并将其与当前位置的元素交换。swap 函数用于交换数组中两个元素的位置。最后,通过 printArray 函数来打印数组元素。

相关推荐
Dovis(誓平步青云)44 分钟前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
一只小小的芙厨1 小时前
AT_tkppc3_d 巨大チェスボード 题解
c++·题解
我在人间贩卖青春1 小时前
C++之继承与派生类的关系
c++·向上造型·向下造型
Trouvaille ~1 小时前
【Linux】应用层协议设计实战(二):Jsoncpp序列化与完整实现
linux·运维·服务器·网络·c++·json·应用层
_OP_CHEN1 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
天天爱吃肉82181 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
im_AMBER1 小时前
Leetcode 114 链表中的下一个更大节点 | 删除排序链表中的重复元素 II
算法·leetcode
EmbedLinX1 小时前
嵌入式之协议解析
linux·网络·c++·笔记·学习
xhbaitxl1 小时前
算法学习day38-动态规划
学习·算法·动态规划
多恩Stone1 小时前
【3D AICG 系列-6】OmniPart 训练流程梳理
人工智能·pytorch·算法·3d·aigc