快速排序详解,附c++代码

1.解释
数组a=[6,4,2,5,8,9,1,3,4,7]
      快排一般是将第一个元素6作为基准元素,另一个指针指向末尾的元素7,然后比较这两个数大小,比6大不变,比6小交换。发现不交换,让指向7的指针往前移,发现交换,让前面的指针往后移(首先由后往前搜索,直到找到比基准值小的,就换到前面的指针,再由前往后搜索,直到找到比基准值大的,换到后面的指针,这样循环)。直到左边的数都比基准值小,右边的都比基准值大,完成一次遍历。接下来就是以第一次基准值为分界线,分成两个数组,重复之前的动作。
以下是a数组的例子

a=[6,4,2,5,8,9,1,3,4,7]
第一次排序
	以6为基准值
	a=[4,4,2,5,3,1,6,9,8,7]	6左边都比6小,右边都比6大
第二次排序
	6左边的数组aleft=[4,4,2,5,3,1]4为基准
		aleft=[1,4,2,3,4,5]	第二个4是基准
	6右边的数组aright=[9,8,7]9为基准
		aright=[7,8,9]
	所以第二次排序的数组a=[1,4,2,3,4,5,6,7,8,9]
第三次排序
	对于aleft=[1,4,2,3,4,5]的
	第二个4左边的数组aleftl=[1,4,2,3]---->aleftl=[1,4,2,3]
	第二个4右边的数组aleftr=[5]---->aleftl=[5]
	对于aright=[7,8,9]9分界
	9左边的arightl=[7,8]---->arightl=[7,8]
	9右边的arightr=[]---->arightl=[]
依此类推
‘
‘
‘’’’

2.C++实现代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//默认数组的第一个数作为参照点
void quicksort(int a[],int left,int right){
    if(left < right){
        int p=a[left];  //第一次的参照点
        int l=left;
        int r=right;
        //直到找到比基准值大的
        while(true){
            while(a[l] <= p){
                l++;
                if (l == right){
                    break;
                }
            }
            //直到找到比基准值大的
            while(a[r] >= p){
                r--;
                if (r == left){
                    break;
                }
            }
            if (l >= r) break;
            
            int temp=a[r];
            a[r]=a[l];
            a[l]=temp;
            
        }
        a[left] = a[r];
        a[r] = p;

        quicksort(a,left,r-1);
        quicksort(a,r+1,right);
    }
    
}



int main(){
    int a[]={3,6,2,1,8,3,2,5,6};
    int len = sizeof(a)/sizeof(int);
    quicksort(a,0,len-1);

    //输出这个数组
    for(int i=0 ; i<len ; i++){
        cout<<a[i]<<",";
    }   
    cout<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值