【数据结构】快排!!!

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

方法一:
【数据结构】快排!!!_第1张图片

注:在数组的左右两边定义两个指针,分别指向数组的最前面和最后面,当其那面的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);
    }
}

方法二:挖坑法
【数据结构】快排!!!_第2张图片

注:定义两个指针,分别指向数组的最其前面和最后面的元素,在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;
}

方法三:
【数据结构】快排!!!_第3张图片

注:定义两个指针,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);
    }
}

你可能感兴趣的:(数据结构)