C++实现基本排序算法2:冒泡排序和快速排序

交换排序的基本思想是:两两比较待排列的元素,返现倒序即交换。基于这种思想的有两种排序方法,即冒泡排序和快速排序。

1. 冒泡排序和快速排序的基本原理

参考文章:

  1. c++实现冒泡排序
  2. 冒泡排序(C/C++ 实现)
  3. 算法 3:最常用的排序——快速排序
  4. 白话经典算法系列之六 快速排序 快速搞定
2. 参考代码
#include <iostream>
#include <vector>

void Swap(std::vector<int>& unorder_array, int a, int b) {  // 交换数据,不使用中间变量
    unorder_array[a] = unorder_array[a] + unorder_array[b]; // 注意这里是unorder_array[b]而不是b
    unorder_array[b] = unorder_array[a] - unorder_array[b];
    unorder_array[a] = unorder_array[a] - unorder_array[b];

}
// 冒泡排序
void BubbleSort(std::vector<int>& unorder_array) {
    for (int i = 1; i < unorder_array.size(); ++i) {    // i代表的是当前的第i轮
        for (int j = unorder_array.size() - 1; j >= i; --j) {
            if (unorder_array[j] < unorder_array[j - 1]) {
                Swap(unorder_array, j , j - 1);
            }
        }
    }
}
// 快速排序的子程序
int QuickSortPartition(std::vector<int>& unorder_array, int left, int right) {
    int i = left;   // 快速排序这里使用"双指针"
    int j = right;
    int temp = unorder_array[left]; // 假设我们选择的是第一个数据
    while (i < j) {
        while (i < j && unorder_array[j] > temp) {  // 首先我们先从右侧循环找到比temp小的数据
            --j;
        }
        if (i < j) {    // 表示我们找到了
            unorder_array[i] = unorder_array[j];    // 进行填坑
            ++i;   // 左边的指针向右移动
        }

        while(i < j && unorder_array[i] < temp) {
            ++i;
        }
        if (i < j) {
            unorder_array[j] = unorder_array[i];
            --j;
        }
    }
    unorder_array[i] = temp;    // temp现在位于中间,左边都小于temp,右边大于temp

    return i;
}
// 快速排序算法
void QuickSort(std::vector<int>& unorder_array, int left, int right) {
    if (left < right) {
        int middle = QuickSortPartition(unorder_array, left, right); // 得到中间位置
        QuickSort(unorder_array, left, middle - 1);
        QuickSort(unorder_array, middle + 1, right);    // 递归分之
    }

}
int main()
{
    std::vector<int> unorder_array;
    int data;
    std::cin >> data;
    unorder_array.push_back(data);
    while (std::cin.get() != '\n') {
        std::cin >> data;
        unorder_array.push_back(data);
    }
    std::cout << "orgin seq is: ";
    for (auto it = unorder_array.begin(); it != unorder_array.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << "\n";
    QuickSort(unorder_array, 0, unorder_array.size() - 1);
    std::cout << "quick sort is: ";
    //BubbleSort(unorder_array);
    //std::cout << "bubble sort is: ";
    for (int i = 0; i < unorder_array.size(); ++i) {
        std::cout << unorder_array[i] << " ";
    }
    return 0;
}

在这里插入图片描述

下面是选择排序~

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值