思路:固定一个数,把这个数放到合法的位置,然后左边的数都是比它小,右边的数都是比它大

固定权值选的是第一个数,或者一个随机数

因为固定的是左端点,所以一开始需要在右端点开始,找一个小于权值的数,从左端点开始,找一个大于权值的数

那么交换他们即可、最后的话,One == two那个位置就是权值应该去到的位置,这个时候把原问题划分为更小的子问题

就是[be, one - 1]和[one + 1, en]这两个子问题。

下面的是有bug的,当rand去到en的时候,就会wa  (修复了)

比如数据是,4、5、1、2就很容易wa

用随机做了一个TLE了,还没wa就TLE了

http://codeforces.com/contest/732/problem/D

ID = be也是TLE,不明白STL的sort是怎么来的

int myRand(int be, int en) {
    return be + (rand() % (en - be + 1));
}

void quickSort(int a[], int be, int en) {
    if (be >= en) return ;
    int id = myRand(be, en); // 这样不行,需要id = be
    int one = be, two = en;
    while (one != two) {
        while (two > one && a[two] >= a[id]) --two; // 找第一个比id小的, 必须先找小的
        while (one < two && a[one] <= a[id]) ++one; // 找第一个比id大的, 因为基准数是be
        if (one < two) swap(a[one], a[two]);
        //固定id = be,需要从右到左是因为,如果是从左到右,例子1、2、3、4、5
        //找到第一个比1大的,是2,然后找不到第一个比1小,在2中相遇
        //然后swap(a[1], a[2])  GG
    }
    swap(a[id], a[one]);
    quickSort(a, be, one - 1);
    quickSort(a, one + 1, en);
}
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-07-30
  • 2022-12-23
  • 2021-09-12
  • 2021-12-19
  • 2022-12-23
  • 2021-11-19
猜你喜欢
  • 2021-07-18
  • 2022-12-23
  • 2021-06-20
  • 2021-12-13
  • 2022-12-23
  • 2022-01-15
相关资源
相似解决方案