排序算法(1)

冒泡排序

工作原理
冒泡排序通过重复遍历数组,将相邻的元素进行比较并交换,使得最大的元素逐渐“冒泡”到数组的末尾。每完成一趟排序,最大的元素就会被固定在最后。

实现细节

  • 外层循环控制排序趟数,从第一个元素开始到最后一个元素。
  • 内层循环进行相邻元素比较,从第一个元素到未排序部分的最后一个元素。
  • 交换相邻元素的顺序以确保较大的元素在后面。
#include <vector>
using namespace std;

void Bubblesort(vector<int> &v) {
    int len = v.size();
    for (int i = 0; i < len; i++) {
        for (int j = 0; j < len - 1 - i; j++) {
            if (v[j] > v[j + 1]) {  // 从小到大排序
                swap(v[j], v[j + 1]); // 交换
            }
        }
    }
}

时间复杂度

  • 最坏情况(逆序):O(n²)
  • 最好情况(已排序):O(n)
  • 平均情况:O(n²)

空间复杂度:O(1)

优缺点

  • 优点:简单易懂,容易实现,适合教学。
  • 缺点:效率低下,尤其对于大规模数据不适用。

应用实例:可以用于对小数组的排序,比如少量成绩的排序。

选择排序

工作原理
选择排序的思路是将数组分为已排序部分和未排序部分。在每一趟中,从未排序部分找到最小的元素,并将其放到已排序部分的末尾。

实现细节

  • 外层循环遍历整个数组,控制已排序部分的末尾。
  • 内层循环找到当前未排序部分的最小元素。
  • 交换最小元素与未排序部分的开头。
#include <vector>
using namespace std;

void Choicesort(vector<int> &v) {
    int len = v.size();
    for (int i = 0; i < len - 1; i++) {
        int min_index = i;  // 假设当前下标的元素为最小值
        for (int j = i + 1; j < len; j++) {
            if (v[j] < v[min_index]) { // 更新最小值的索引
                min_index = j;
            }
        }
        swap(v[min_index], v[i]); // 交换
    }
}

时间复杂度

  • 无论是最佳、最坏还是平均情况:O(n²)

空间复杂度:O(1)

优缺点

  • 优点:简单,交换次数较少(较少交换操作)。
  • 缺点:效率低,尤其是在数组较大时,适用性差。

应用实例:可以用于手动选择最小值并放置,适合小规模数据处理。
 

插入排序

工作原理
插入排序的核心思想是将每个元素插入到已排序的部分中。每次处理一个元素时,将其与已排序部分的元素进行比较,找到合适的位置进行插入。

实现细节

  • 外层循环从第二个元素开始遍历(第一个元素默认已排序)。
  • 内层循环从当前元素开始向前遍历,寻找插入位置。
  • 将大于当前元素的元素向后移动,为当前元素腾出位置。
#include <vector>
using namespace std;

void InsertSort(vector<int> &v) {
    int len = v.size();
    for (int i = 1; i < len; ++i) {
        int temp = v[i];  // 当前待插入的元素
        int j = i - 1;
        while (j >= 0 && v[j] > temp) { // 移动已排序部分元素
            v[j + 1] = v[j];
            j--;
        }
        v[j + 1] = temp;  // 插入元素到合适的位置
    }
}

时间复杂度

  • 最坏情况(逆序):O(n²)
  • 最好情况(已排序):O(n)
  • 平均情况:O(n²)

空间复杂度:O(1)

优缺点

  • 优点:对小规模或部分有序数据效率高;稳定性好(相同元素顺序不变)。
  • 缺点:对于大规模数据表现不佳。

应用实例:适合实时插入数据的场景,例如实时数据流处理、牌局排序等。

适用场景总结

排序算法最佳适用场景不适用场景
冒泡排序学习排序概念,处理少量数据大数据量排序,性能要求高的场景
选择排序数据量小且不要求稳定性时大数据量排序
插入排序小规模或部分有序数据排序,实时数据处理大数据量,完全无序的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值