手搓快排,加入基准数选取优化反而TLE
查看原帖
手搓快排,加入基准数选取优化反而TLE
1174346
ginkgoTree楼主2023/10/30 11:01
#include<stdio.h>
int nums[2000000];

void swap(int a,int b){
    int t=nums[a];
    nums[a]=nums[b];
    nums[b]=t;
}

int medianThree(int l,int m,int r){
    if((nums[l]<nums[m])^(nums[l]<nums[r])){
        return l;
    }
    else if((nums[m]<nums[l])^(nums[m]<nums[r])){
        return m;
    }
    else
    return r;
}

int partiton(int l,int r){
    swap(l,medianThree(l,(l+r)/2,r));/*这行就是基准数选取为左中右中的中位数*/
    int i=l;
    while(i<r){
        while(i<r&&nums[r]>=nums[l]){
            r--;
        }
        while(i<r&&nums[i]<=nums[l]){
            i++;
        }
        swap(i,r);
    }
    
    swap(i,l);
    return i;
}

void quick_sort(int l,int r){
    if(l>=r){
        return;
    }
    int part=partiton(l,r);
    quick_sort(l,part-1);
    quick_sort(part+1,r);
}

int a,b;

int main(){
    scanf("%d %d",&a,&b);
    for(int i=0;i<b;i++){
        scanf("%d",nums+i);
    }
    quick_sort(0,b-1);
    for(int i=0;i<b;i++){
        printf("%d ",nums[i]);
    }
    return 0;
}
  • 基准数选取优化为了防止快排劣化到O(n2)
  • 去掉基准数优化,不会出现TLE,直接AC,反之出现TLE
2023/10/30 11:01
加载中...