数据结构算法——1055. 快速排序的优化

题目

数据结构算法——1055. 快速排序的优化_第1张图片

思路

当给一个基本逆序,或者基本有序的数组中,快速排序会退化成选择排序
所以我们除了题目提示给的思路之外
还可以先把各个小的部分(比如每个部分只有50个元素)进行插入排序,让整个数组不那么逆序再进行快排操作,可以大大缩减快排(避免退化成选择排序)的操作时间

代码

#include
using namespace std;

void choosesort(int* arr, int left, int right)
{
    for(int i = left; i <= right; i++)
    {
        int min = arr[i];
        int pos = i;
        for(int j = i + 1; j <= right; j++)
        {
            if(arr[j] <= min)
            {
                min = arr[j];
                pos = j;
            }
        }
        arr[pos] = arr[i];
        arr[i] = min;
        
    }
}

int compare_mid(int* arr, int left, int right)
{
    int mid = (left + right) / 2;
    if( (arr[mid] <= arr[right] && arr[mid] >= arr[left]) || 
        (arr[mid] >= arr[right] && arr[mid] <= arr[left]) )
        return mid;
    
    if( (arr[left] <= arr[right] && arr[mid] <= arr[left]) || 
        (arr[left] >= arr[right] && arr[mid] >= arr[left]) )
        return left;

    else
        return right;
}

void quicksort(int* arr, int left, int right)
{
    int a = left, b = left + 40;
    while(b < right)
    {
        choosesort(arr,a,b);
        a += 40; b += 40;
    }


    if(right - left < 30)
        choosesort(arr, left, right);
    else
    {
        int pivot = compare_mid(arr,left,right);
        int temp = arr[pivot];
        //cout << temp <<" ? " << arr[left] << "  " << arr[right]  << endl;
        arr[pivot] = arr[left];
        arr[left] = temp;


        int l = left, r = right, com = arr[left];
        while(l < r)
        {
            while(l <= r && arr[r] >= com)
                r--;
            if(l < r)
                arr[l++] = arr[r];
            while(l < r && arr[l] < com)
                l++;
            if(l <= r)
                arr[r--] = arr[l];
        }
        arr[l] = temp;

        // for(int i = left; i <= right; i++)
        //     cout << arr[i] << " ";
        // cout << endl;
        quicksort(arr, left, l - 1);
        quicksort(arr, l + 1, right);
    }
}//

int main()
{
    int n;
    cin >> n;
    int* arr = new int[n];
    for(int i = 0; i < n; i++)
        cin >> arr[i];
    quicksort(arr, 0, n - 1);
    for(int i = 0; i < n; i++)
        cout << arr[i] <<" ";
}

你可能感兴趣的:(数据结构算法,1024程序员节,数据结构)