快排
查看原帖
快排
1465046
OxyaneOH2楼主2024/10/8 23:49

主打一个不讲武德

sort(nums.begin(),nums.end());

正经解法

void quicksort(vector<int>&nums, int left, int right){
  //防止无限递归
  if(l>=r) return;
  //pivot为基准,大于基准的放右边,小于基准的放左边
  int l=left,r=right,pivot=nums[l];
  while(l<r){
    //里面两个while的l<r别掉了,r减到-2147483648就丸辣
    while(l<r&&nums[r]>=key) --r;
    //把右边那个小的数拿到左边,至于最左边那个?那是pivot啊
    nums[l]=nums[r];
    while(l<r&&nums[l]<=key) ++l;
    nums[r]=nums[l];
  }
  //把pivot拿回来
  nums[l]=pivot;
  //最后对左右两边快排
  quicksort(nums,left,l-1);
  quicksort(nums,l+1,right);
}

照着copilot的代码默写了好多遍,终于会写了TaT

2024/10/8 23:49
加载中...