分治思想之快速排序

来源:互联网 发布:牛群 冯巩 知乎 编辑:程序博客网 时间:2024/06/04 18:13

void QuikSort(int arr[], int length){


    QuikSort(arr,0,length-1);    


}


//low:数组的左边界值,开始为0
//high:数组的右边界值,开始为length-1
void QuikSort(int arr[], int low, int high){
    if(low>=high){    //递归退出条件:只有一个元素时
        return;
    }


    int pivot = arr[low];
    int i=low;
    //这里的实现有点不一样,先找出pivot小的放到一边,而不是直接交换pivot和目标
    for(int j=low+1;j<=high;j++){
        if(arr[j]<=pivot){        //a[j] is smaller than pivot
            i++;    //只要找到小于pivot的目标就向前挖多一个坑
            if(i!=j){
                Swap(arr[i],arr[j]);//但只有目标不占坑位时才需要交换
            }
        }
    }
    //最后才将pivot放到中间隔离两边的数
    //有可能所有的数都比pivot大,这样也不需要交换
    Swap(arr[low],arr[i]);    //Swap pivot to middle position
    
        //进行分化(partition),递归
    QuikSort(arr,low,i-1);        //a[i] is the pivot now
    QuikSort(arr,i+1,high);
}




void Swap(int &a, int &b){
   int temp = a;
   a = b;
   b = temp;
}

0 0