为什么C++sort比手写快排还慢?
查看原帖
为什么C++sort比手写快排还慢?
816549
52wyd楼主2022/12/20 21:59

这是我手写的快排

#include<stdio.h>
void swap(int *x, int *y);
void StandardCount(int a[],int low,int high);
void QuickSort(int a[],int low,int high);
int ml, mh, a[100005];
int main(void)
{
    int n, i;
    
    scanf("%d", &n);
    for (i = 0; i <= n - 1; i ++)
        scanf("%d", &a[i]);
       
    QuickSort(a, 0, n - 1);

    for (i = 0; i <= n - 1; i ++)
    {
        if (i >= 1)
            putchar(' ');
        printf("%d", a[i]);
    }
    putchar('\n');
    
    return 0;
}
void swap(int *x, int *y)
{
    int t = *x; *x = *y; *y = t;   
}
//获取基准坐标,使数列相对有序(左边比基准坐标小,右边比基准坐标大)
void StandardCount(int a[], int low, int high) 
{
    int l = a[low], m = a[(low+high)/2], h = a[high], key, left = low, right = high;
    
    if (m > l && m < h || m > h && m < l)
        swap(&a[low], &a[(low+high)/2]);
    else if (h > l && h < m || h > m && h < l)
        swap(&a[low], &a[(low+high)/2]);
    
    key = a[low];
    while (low < high) 
    {  
        //high指针从后向前遍历,元素比基准元素大则指针向前移动 
        while (low < high && a[high] >= key)//若为降序排序,改为:a[high] <= key
            high --;
            
        if (low < high)
            a[low] = a[high];
        
        //low指针从前向后遍历,元素比基准元素小则指针向后移动 
        while (low < high && a[low] <= key)//若为降序排序,改为:a[low] >= key
            low ++;
        
        if (low < high)
            a[high] = a[low];
    
    }
    a[low] = key;//此时low == high,且此位置为空
    ml = mh = low;
    
    for (int i = ml - 1; i >= left; i --)
    {
        if (a[i] == key)
        {
            swap(&a[i], &a[ml-1]);
            ml --;
        }
    }
    for (int i = mh + 1; i <= right; i ++)
    {
        if (a[i] == key)
        {
            swap(&a[i], &a[mh+1]);
            mh ++;
        }
    }
}
void QuickSort(int a[], int low, int high)
{
    if(low < high)//递归出口
    {  
        StandardCount(a, low, high);
        QuickSort(a, low, ml - 1);    //比基准元素小的部分继续调用快速排序 
        QuickSort(a, mh + 1, high);   //比基准元素大的部分继续调用快速排序 
    }
}

手写快排69ms,C++的sort是115ms 都加了氧气

2022/12/20 21:59
加载中...