快排qsort的细节问题

递归函数

终止条件,选轴值,放最后,找划分,与最后交换,左右两边再递归

找轴值函数

划分函数

两边走,停止交换要加减,返回左位置

细节问题

这次重写快速排序,发现了一些细节问题都没有注意到,主要是划分函数两边的指针走动时候什么时候停止此时又是什么情况。

细节一:必须先左后右,如果相反的,r停再l处,而l是小于轴值的话不应调换
细节二:划分函数当输入的参数l,r相等时,而A[l]又小于pivots时候应该换它

//递归函数qsort:终止条件,选轴值,放最后,找划分,与最后交换,左右两边再递归
//划分函数partition:两边走,停止交换要加减,返回左位置
//注意细节问题:
#include <bits/stdc++.h>
using namespace std;
inline int partition(int A[],int l,int r,int pivot){
    //l,r并不是一起动的,而是先l动,然后r动,
    //细节一:必须先左后右,如果相反的,r停再l处,而l是小于轴值的话不应调换
    //所以当它俩相等时即找到应该返回的位置
    //划分位置左边都是小于轴值的,右边都是大于等于轴值的
    //do-while和while的区别,do-while是先执行后判断至少执行一次,while是先判断后执行可以不执行
    while(l<r){  
        while(l<r&&A[l]<pivot) l++;
        while(l<r&&A[r]>=pivot) r--;
        //交换此时l,r位置的两个元素
        if(l<r){//优化l,r相等时候没偶必要的交换
        int temp=A[l];
        A[l]=A[r];
        A[r]=temp;
        }

    }//l==r相遇时候退出循环
    //细节二:当输入的参数l,r相等时,而A[l]又小于pivots时候应该换它
    if(A[l]<pivot) l++;
    return l;
    
}
int findpivot(int i,int j){
    return (i+j)/2;
}
void qsort(int A[],int i,int j){
    //递归终止条件
    if(j<=i) return ;

   //选轴值与最后一个元素交换
    int  pivotindex=findpivot(i,j);
    int pivot=A[pivotindex];
    A[pivotindex]=A[j];
    A[j]=pivot;

    //进行划分,返回左右指针相遇的位置
    //划分区间注意
    int k=partition(A,i,j-1,pivot);
    
    //将轴值放回到该放的位置
    int temp=A[k];
    A[k]=A[j];
    A[j]=temp;
 
    qsort(A,i,k-1);
    qsort(A,k+1,j);

}
int main()
{
    while (true)
    {
        int n;
        cin>>n;
        int a[n];
        for(int i=0;i<n;i++)
        cin>>a[i];
        //int a[4]={7,4,8,11};
        qsort(a,0,n-1);
        for(int i=0;i<n;i++) cout<<a[i]<<",";

    }
    

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值