【資料結構】快排!!!

doctor_xiong發表於2018-01-08

快速排序是C.R.A.Hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(Divide-and-ConquerMethod)。

該方法的基本思想是:

1.先從數列中取出一個數作為基準數。

2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

3.再對左右區間重複第二步,直到各區間只有一個數。

方法一:
這裡寫圖片描述

注:在陣列的左右兩邊定義兩個指標,分別指向陣列的最前面和最後面,當其那面的left指向的資料大於key值,那麼right從後面向前面尋找第一個小於key值的資料,當left


int pation3(int * arr,int left,int right)
{
    if(NULL == arr)
        return -1;
    int key = arr[right];
    int cur = right;
    while(left < right)
    {
        while(left < right && arr[left] > key)
            left++;
        while(left < right && arr[right] < key)
            right--;
        if(left < right)
            swap(arr[left] ,arr[right]);
        left ++ ;
        right--;
    }
    swap(arr[right + 1],arr[cur]);
    return right+1;
}



void fastsort(int* arr,int left ,int right)
{
    if(left < right)
    {
        int key = pation3(arr,left,right);
        fastsort(arr,left,key-1);
        fastsort(arr,key+1,right);
    }
}

方法二:挖坑法
這裡寫圖片描述

注:定義兩個指標,分別指向陣列的最其前面和最後面的元素,在key裡面儲存陣列裡面的最後一個元素,那麼left從前面向後面查詢第一個大於key值的值,並將left對應的值賦給right對應的值,再從right從後面向前面走,找到第一個小於key值的值,並且將right裡面的值賦給left,當left>right的時候迴圈終止。

實現程式碼:

template<class T>
int pation(T* arr,int left,int right)
{
    if(NULL == arr)
        return -1;
    int tmp = arr[right];
    int begin = left;
    int end = right;
    while(begin < end)
    {
        while(begin < end && arr[begin] < tmp)
            begin++;
        if(begin < end)
            arr[end] = arr[begin];
        while(begin < end && arr[end] > tmp)
            end--;
        if(begin < end )
            arr[begin] = arr[end];
        begin++;
        end--;
    }
    arr[end+1] = tmp;
    return end+1;
}

方法三:
這裡寫圖片描述

注:定義兩個指標,cur指向left,pre指向left前面的位置,cur一直向後走,當找到第一個大於key的值的時候將cur和pre裡面的值進行互換,當cur

template<class T>
int pation4(T * arr,int left,int right)
{
    if(NULL == arr)
        return -1;
    int cur = left;
    int pre = cur-1;
    T key = arr[right];
    while(cur < right)
    {
        if(cur != pre && arr[cur] > key)
            swap(arr[++pre],arr[cur]);
        cur++;
    }
    swap(arr[pre+1],arr[right]);
    return pre+1;
}

以上三種呼叫程式碼如下:

template<class T>
void fastsort(T* arr,int left ,int right)
{
    if(left < right)
    {
        int key = pation4(arr,left,right);
        fastsort(arr,left,key-1);
        fastsort(arr,key+1,right);
    }
}

相關文章