快速排序应用——AcWing

基本思想:

在所有元素中选取一个数字作为排列标准,并以此标准将数组分成两部分(大于该标准数的,以及小于该标准数的),并在每次循环将小于该数的置于一侧,大于该数的置于另一侧,不断递归以实现数组的排列。

具体实现:

关键部分,快排函数的编写。

快排函数的形参是数组地址,左界和右界;函数内容首先判断左界是否小于右界,并以此作为函数是否返回的标准;

其次,定义i,j变量对本次递归调用进行遍历,将i赋值为l-1,将j赋值为r+1,因每次递归遍历采用do,while语句,在进行判断前就对变量进行操作,并且选定lr的加和中值作为标准数坐标(即a[l+r>>1]为标准数);而后对本次递归的数组部分进行遍历排序,通过新变量i,j进行判断(因为只有函数内部的局部变量ij能够不断赋予新值,且在下一次递归调用时依旧以i=l-1,j=r+1开始;而lr所起到的作用更像是规定每次递归的数组范围,须在每次遍历完成后ij都指向本次递归数组中间地址时,才能实现lr数据的更新);while循环内部,通过do,while对两各部分内容进行判断,找到左侧大于标准数的数以及右侧小于标准数的数,swap对两数进行交换。需注意,因找到两数可能存在i>j的情况,此情况下,交换指令不应该被执行,因此swap前,应添加判断语句if(i<j);

快排是先对整个程序进行排序,而后分别对两个部分再进行排序,因此quick_sort函数,递归语句写在主题语句之后。

附源码:

#include<iostream>

using namespace std;

const int N=100010;

int q[N];

void quick_sort(int q[],int l,int r)
{
    if(l>=r) return;
    
    int i=l-1,j=r+1,x=q[l+r>>1];
    
    while(i<j){
        do i++;while(q[i]<x);
        do j--;while(q[j]>x);
        if(i<j) swap(q[i],q[j]);
    }
    
    quick_sort(q,l,j);
    quick_sort(q,j+1,r);
}

int main()
{
    int n;
    scanf("%d",&n);
    
    for(int i=0;i<n;i++) scanf("%d",&q[i]);
    
    quick_sort(q,0,n-1);
    
    for(int i=0;i<n;i++) printf("%d ",q[i]);
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值