排序算法c++实现

一、冒泡排序

// 冒泡排序
void BubbleSort(vector<int> v) {
    int n = v.size();
    // i代表第几轮,总共有n-1轮排序
    // j是索引,用来对数组v进行操作
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < n - i; j++) {
            if (v[j] > v[j + 1]) {
                swap(v[j], v[j + 1]);
            }
        }
    }
}

二、插入排序

数组分为两部分,有序和无序
将无序数组的元素插入有序数组 [参考1]
// 插入排序
void InsertSort(vector<int> v) {
    int n = v.size();
    //i是无序数组头部,j是遍历整个有序数组的下标
    for (int i = 1; i < n; i++) {
        for (int j = i - 1; j >= 0 && v[j] > v[j+1]; j--) {
            swap(v[j], v[j + 1]);
        }
    }
}

三、选择排序

每次选择 最小的数放在数组首部,有n个数则选择n次 [参考1]
// 选择排序
void SelectSort(vector<int> v) {
    int n = v.size();
    for (int i = 0; i < n; i++) {
        int min_ = i;
        for (int j = i + 1; j < n; j++) {
            min_ = v[min_] >= v[j] ? j : min_;
        }
        if(i != min_)
            swap(v[i], v[min_]);
    }
}

四、快排

pivot是分界点
在pivot以前的数都比v[pivot]小,在pivot以后的数都比v[pivot]大 [参考2] [参考3]
//快排
void QuickSort(vector<int>& v, int start, int end) {
    if (start >= end) return;
    int pivot = start;
    int i = start;
    int j = end;
    while (i < j) {
        //j向左移,找到第一个比基准v[pivot]小的
        while (v[j] >= v[pivot] && i < j) j--;
        //i向右移,找到第一个比基准值v[pivot]大的
        while (v[i] <= v[pivot] && i < j) i++;
        //左右指针相遇前交换
        if(i < j)
            swap(v[i], v[j]);
    }
    swap(v[pivot], v[i]);
    QuickSort(v, start, i - 1);
    QuickSort(v, i + 1, end);
}

五、完整代码

#include<iostream>
#include<vector>

using namespace std;
void Print(vector<int> v) {
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;
}
// 冒泡排序
void BubbleSort(vector<int> v) {
    int n = v.size();
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < n - i; j++) {
            if (v[j] > v[j + 1]) {
                swap(v[j], v[j + 1]);
            }
        }
    }
    Print(v);
}

// 插入排序
void InsertSort(vector<int> v) {
    int n = v.size();
    for (int i = 1; i < n; i++) {
        for (int j = i - 1; j >= 0 && v[j] > v[j + 1]; j--) {
            swap(v[j], v[j + 1]);
        }
    }
    Print(v);
}

// 选择排序
void SelectSort(vector<int> v) {
    int n = v.size();
    for (int i = 0; i < n; i++) {
        int min_ = i;
        for (int j = i + 1; j < n; j++) {
            min_ = v[min_] >= v[j] ? j : min_;
        }
        if (i != min_)
            swap(v[i], v[min_]);
    }
    Print(v);
}

//快排
void QuickSort(vector<int>& v, int start, int end) {
    if (start >= end) return;
    int pivot = start;
    int i = start;
    int j = end;
    while (i < j) {
        while (v[j] >= v[pivot] && i < j) j--;
        while (v[i] <= v[pivot] && i < j) i++;
        if(i < j)
            swap(v[i], v[j]);
    }
    swap(v[pivot], v[i]);
    QuickSort(v, start, i - 1);
    QuickSort(v, i + 1, end);
}

int main() {
    vector<int> v = { 2,9,-9,7,-6,8,0 };
    BubbleSort(v);
    InsertSort(v);
    SelectSort(v);
    QuickSort(v, 0, v.size()-1);
    Print(v);
    return 0;
};

参考:

1、https://mp.weixin.qq.com/s/YQN-DE5aVRO1m1PDXlVAPg

2、https://mp.weixin.qq.com/s/oty0EH_k6iuU-SZYPRWGSg

3、(221条消息) c++之七种经典排序算法-C++文档类资源-CSDN文库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值