快速排序法

快速排序,顾名思义就是能有效加快排序速度,提高代码效率的排序方法。在日常做题的过程中有时会碰到数据量巨大,插入排序、冒泡排序、选择排序都无法在规定的时间内完成的排序问题。

在快速排序中,我们需要在数组中随机寻找一个“标​​​​​​​志数”,将全部大于此数的与全部小于“标志数”的分列该数的两端,然后根据“标志数”分开,再分开的这两段数中再次寻找随机的“标志数”,再次进行分类,以此类推,知道不可分割为止,此时这个无序数列就变得有序。

总的来说,快速排序就是运用递归的思想,将一段无序的数列利用“标志数”逐渐分成若干个子数列,类推得到若干个有序子数列,最终得到一个完整的有序数列的过程。

在代码实现快速排序的过程中,对于考虑“标志数”应该取数组中的哪一位,其实仔细一想“标志数”无所谓在数组的哪一位,因为实际上“标志数”的位置并不影响代码的运行以及排序,位置会通过影响分成的子数列的数量不同,进而影响到排列成有序数列的时间。

最重要的是而如何实现将“标志数”一端分别放上比该数大的数,另一端放上较“标志数”少的数并实现递归。

从数列左边找到第一个大于“标志数”的数字(以升序排列为例),再从数列右边找到第一个比“标志数”小的数,进行交换。

快排函数

void seq(int a[],int n,int m)
{
    int x=n,y=m,flag=a[(n+m)/2],temp;
    do//实现寻找“标志数”两端第一个大于、小于的数值并进行交换
    {
        while (a[x]<flag)x++;
        while (a[y]>flag)y--;
        if(x<=y)
        {
            swap(a[x],a[y]);
            x++;
            y--;
        }
    }
    while(x<=y);

    if(n<y) seq(a,n,y);//递归调用实现快速排序。
    if(x<m) seq(a,x,m);
}

将代码封装在一个函数体中。

 在主函数中只需调用函数即可实现快排:

#include <iostream>

using namespace std;

void seq(int a[],int n,int m)
{
    int x=n,y=m,flag=a[(n+m)/2],temp;
    do
    {
        while (a[x]<flag)x++;
        while (a[y]>flag)y--;
        if(x<=y)
        {
            swap(a[x],a[y]);
            x++;
            y--;
        }
    }
    while(x<=y);

    if(n<y) seq(a,n,y);
    if(x<m) seq(a,x,m);
}
int main()
{
    int b[5];
    for(int i=0;i<5;i++)
    {
        cin>>b[i];
    }
    seq(b,0,4);
    for(int i=0;i<5;i++)
    {
        cout<<b[i]<<" ";
    }
    cout<<endl;
    
}

这里以内容5个数据的数组为例,运行结果:

 

Last login: Sat Mar 19 22:08:24 on ttys000
1 4 3 2 5
1 2 3 4 5 
i@HUAWEI-MateBook-X-Pro ~ % 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值