最近刷leetcode经常碰到排序问题,大家都知道排序算法中快速排序是效率很高的算法,因此快排写法是必须要掌握的哦!
解题思路
利用快排对数组进行排序。
快排:冒泡排序的改良。
快排目标:将数组从大到小排序
快排步骤:
- 将数组的第一个值设置为一个基准数pivot,i指向第二个值,j指向最后一个值。先将j往前移动,直到找到比pivot大的值,固定j。再将i往后移动,直到找到比pivot小的值,固定i。**注意移动i和j的时候最多只能使他俩相遇,不能交叉!**接下来交换i和j指向的数组的值,将比pivot大的数移到前面,比pivot小的数移到后面。重复此步骤,直到i和j相遇。
- i和j相遇后,不再移动i和j。将i和j指向的值与pivot交换。这里要判断pivot和i指向的值得大小,pivot<nums[i]才交换,是考虑到只含两个元素的数组的情况。
- 接下来分别对基准数pivot左边和右边部分做快排,递归得到最终结果。
注意:
- 注意i和j移动时不能交叉!即移动时,i永远小于j!
- 为了保证基准数右边的数都小于基准数,左边的数都大于基准数,必须从右边j开始移动!(反之从小到大排序依然!)如果从左边开始移动,i停留地方的值必定小于基准数,若j左移时没有大于基准数的值,j则也停留在i的位置,则基准数与该位置数据交换时,将把小于基准数的数移到左边。
- 注意考虑含两个元素的数组的情况!
C语言代码
void quickSort(int *nums, int start, int end) {
int pivot=nums[start], temp, i = start + 1, j = end - 1;
if (i > j) {
return;
}
while(i < j) {
while(nums[j] <= pivot && j > i) {
j--;
}
while(nums[i] >= pivot && j > i) {
i++;
}
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
if (pivot < nums[i]) {
nums[start] = nums[i];
nums[i] = pivot;
}
quickSort(nums, start, i);
quickSort(nums, i, end);
}