三路快排最后一个TLE了0.07s,求助

P1923 【深基9.例4】求第 k 小的数

MikanseIA @ 2024-11-18 20:57:59

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void swap(int arr[] , int x , int y) {
  int t = arr[x]; arr[x] = arr[y]; arr[y] = t;
}
void sort(int arr[] , int left , int right) {
  if(right <= left) return;
  int lt = left + 1, gt = right , i = left + 1;
  int random_index = left + rand() % (right - left + 1);
  swap(arr,left,random_index);
  int pivot = arr[left];/*lt = less than gt = greater than*/
  while(i <= gt) {
    if(arr[i] == pivot) i++;
    else if(arr[i] > pivot) {
      swap(arr,gt,i); gt--;
    }
    else {
      swap(arr,lt,i); lt++; i++;
    }
  }
  swap(arr,left,lt - 1);
  sort(arr,left,lt - 2); sort(arr,gt + 1,right);
}
int main() {
  int n,k; int *nums;
  scanf("%d%d",&n,&k);
  nums = (int*)malloc(sizeof(int) * n);
  for(int i = 0 ; i < n ; i++) scanf("%d",&nums[i]);
  sort(nums,0,n - 1);
  printf("%d",nums[k]);
  free(nums);
}

by ZMQ_Ink6556 @ 2024-11-18 21:15:30

@MikanseIA 这题不是让你练习 quick-3 sort 的,常数复杂度不可忽略,如果想要练习,可以来这里。C++ 内置的 sort() 函数就有大量的优化,所以才不会导致 TLE 的发生。


by ZMQ_Ink6556 @ 2024-11-18 21:18:35

@MikanseIA sort 是这个样子的,绝对不是短短几行代码能够做到的优秀复杂度 桶排序除外


by MikanseIA @ 2024-11-18 22:53:56

@ZMQ_Ink6556谢谢!


|