快速排序(一)

快速排序的基本思想:

1:先选定一个特定的数v,将一组数分为三个部分。需要三个下标来表示。l:作为左值,j:标定值,i:作为右值。arr[l+1..j]<v,v,arr[j+1..i-1]>v

2:接着判断i+1后面的部分属于哪一部分。若arr[i+1]>v,不动,直接将该数放在此处就好。

若arr[i+1]<v,则需要将i+1的数放到前一部分去。首先将arr[i+1]和j+1位置处的元素互换。(因为j+1处的元素要大于v)此时将j自加。

分好后,最后一步将特定的数v与当前j处的元素进行互换。

代码展示:使用了递归的方法对要排序的数据不断的进行排序,最后得出的数据就是已排好的数据。

//对arr[l..r]部分进行partition的操作
//返回p,使的arr[l...p-1]<arr[p];arr[p+1,r]>arr[p]
template <typename T>
int  __partition_(T arr[],int l,int r)
{

    T v=arr[l];

    int j=l;
    for(int i=l+1;i<=r;i++)
    {
        if(arr[i]<v)
        {
            swap(arr[j+1],arr[i]);
            j++;
        }
    }
    swap(arr[l],arr[j]);
    return j;
}
//对arr[l..r]前闭后闭的部分进行快速排序
template <typename T>
void __qiuckSort(T arr[],int l,int r)
{
    if(l>=r)
        return;

    int p= __partition_(arr,l,r);
    __qiuckSort(arr,l,p-1);
    __qiuckSort(arr,p+1,r);

}
//快速排序:也将使用递归的方式对针对的数据进行排序
template <typename T>
void quickSort(T arr[],int n){

    __qiuckSort(arr,0,n-1);
}

 

posted @ 2018-03-26 22:59  boht  阅读(99)  评论(0编辑  收藏  举报