快速排序算法实现

欢迎来到MilkCoder的博客:

排序在各种场合经常被用到。
快速排序是十分常用的高效率的算法。

其思想是:先选一个“标尺”,
用它把整个队列过一遍筛子,
以保证:其左边的元素都不大于它,其右边的元素都不小于它。

这样,排序问题就被分割为两个子区间。
再分别对子区间排序就可以了。

快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

下面附上代码:

#include <cstdio>
void qs(int *a,int left,int right){
    if(left<right){
        int low=left,high=right;
        int key=a[left];//将数列最左端的值设为基准值;
        while(low<high){
            while(low<high&&a[high]>=key) high--;//寻找第一个比基准值小的元素;
            if(low<high) a[low++]=a[high];//找到,并将该元素放在key的左端;
            else break;//没找到 ,说明low>=high即已经找到key应该在的位置下标;
            while(low<high&&a[low]<=key) low++;//寻找第一个比基准值大的元素;
            if(low<high) a[high--]=a[low];//找到,并将该元素放在key的右端;
            else break;
        }//循环结束时 low与high相等; 
        a[low]=key;//将key放在合适的位置,此时,key左边的值都不大于它,右边的值都不小于它; 
        qs(a,left,low-1);
        qs(a,low+1,right); 
        //对该函数进行递归调用,完成对key左边序列和右边序列的排序; 
    }
}
int main(){
    int a[]={9,8,7,6,5,4,3,2,1,0};
    qs(a,0,9);
    for(int i=0;i<10;i++) printf("%d ",a[i]);
    return 0;
}


再附上指针版本的代码:
#include <cstdio>
void quicksort(int *left,int *right){
    if(left<right){
        int *low=left,*high=right,key=*left;
        while(low<high){
            while(low<high&&*high>=key) high--;
            if(low<high){
                *low=*high;
                low++;
            }
            else break;
            while(low<high&&*low<=key) low++;
            if(low<high){
                *high=*low;
                high--;
            }
            else break;
        }
        *low=key;
        quicksort(left,low-1);
        quicksort(low+1,right);
    }
} 
int main(){
    int a[]={2,4,9,3,6,7,1,5};
    quicksort(a,a+7);
    for(int i=0;i<8;i++) printf("%d ",a[i]);
    return 0;   
}

“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值