思想:
1.填坑和划分
以某个数为基准,一般选第一个数,从数组头尾两边开始遍历。
选出来的基准数会用一个变量保存,这样的话,这个基准数所在的数组的位置就相当于有个坑。
先从尾那边开始,找到比基准数小的,就放到左边的坑。放了之后左边的坑就填上了,右边就出现坑了。
然后又从头那边开始,找到比基准数大的,就放到右边的坑。这样子左边又出现了坑。
直到头尾相遇的时候,把基准数放到此时的坑的位置。
这样子数组就划分成了前后两部分。
2.递归
对前面一部分快排。
对后面一部分快排。
图解:
代码:
void quickSort(int s[], int l, int r){ if(l < r){ int i = l; int j = r; int x = s[i]; while(i < j){ while(i < j && s[j] >= x){//从尾部开始,找到比 x 小的数 j--; } if(i < j){ s[i++] = s[j]; } while(i < j && s[i] < x){//从头部开始,找到比 x 大的数 i--; } if(i < j){ s[j--] = s[i]; } } s[i] = x; quickSort(s, l, i-1); quickSort(s, i+1, r); } }