c++常见的排序算法(不定期更新)

整理一下自己学过的排序算法,顺便当复习了

(一)冒泡排序BubbleSort

思路:运用双层for循环,外层用来判定一共需要排序几次,内层决定每次排序的终点位置;
注意事项:当把排序当封装时,一定要运用引用或指针,保证交换改变了原本的数据;
完整代码演示:

#include<iostream>
#include<vector>
using namespace std;
//!!!注意,当把排序当封装时,一定要运用引用或指针,保证交换改变了原本的数据;
void BubbleSort(vector<int> &a,int num)
{
    for (int i = 0; i < num; i++)
    {
        for (int j = 0; j <num-i-1 ; j++)
        {
            if (a[j] > a[j + 1])
            {
                swap(a[j], a[j + 1]);
            }
        }
    }
}
int main()
{
    vector<int>a = { 2,4,1,5,7,4,9,3 };
    int num;
    num=a.size();
    BubbleSort(a, num);
    for (int i = 0; i < num; i++)
    {
        cout << a[i] << " " ;
    }
    cout << endl;
    return 0;
}

(二)快速排序QuitSort

思路:定义两个指针(left,right),分别指向数组的最左和右边,将temp赋予数组第一个元素,temp用来作为本轮排序的分界线,将比temp小的元素放在左边,比temp大的放在右边,具体的做法为:
(1)先把a[left]赋值给temp,相当于在left处刨了一个空白的坑,值给temp处保存,再保证left

#include <iostream>

using namespace std;

void Qsort(int* a, int start, int end)
{
    //必须要写,不写停止运行
    if (start >= end)
    {
        return;
    }
    int left = start;
    int right = end;
    int temp = a[left];

    while (left < right)
    {
        while (left < right && a[right] >= temp)//left<right必须要写,a[right]>temp需要写=,否则停止运行
        {
            --right;
        }

        a[left] = a[right];

        while (left < right && a[left] <= temp)
        {
            ++left;
        }

        a[right] = a[left];

    }
    a[left] = temp;
    Qsort(a, start, left - 1);
    Qsort(a, left + 1, end);
}
int main()
{
    int a[] = { 4,2,1,5,7,4,9,3 };//测试用例包含重复值以及重复值为第一位
    int num;
    num = sizeof(a) / sizeof(a[0]);//很6的写法
    Qsort(a, 0,num - 1);

    for (int i = 0; i < num; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;

    return 0;
}

至于快速排序使用vector排序的正确代码,还没弄出来2333,有时间再弄吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值