class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型vector 待排序的数组
* @return int整型vector
*/
vector<int> MySort(vector<int>& arr) {
// write code here
quick_sort(arr, 0, arr.size() -1);
return arr;
}
void quick_sort(vector<int>& arr,int left, int right)
{
if(left>=right)
return ;
int pivotkey = arr[left];
int i = left, j =right;
while(left<right)
{
while(left<right&&arr[right]>pivotkey)
right--;
arr[left] = arr[right];
while(left<right&&arr[left]<pivotkey)
left++;
arr[right] = arr[left];
}
arr[left] = pivotkey;
quick_sort(arr, i, left - 1);
quick_sort(arr, left + 1, j);
}
};
如果是以最左侧为枢纽元的话,一定要从右侧开始判断,因为一开始已经把枢纽元的值保存了。
在内层while循环中,一定不能写成left<=right,因为如果左右指针相遇时循环应该结束,如果加成等于当指针相遇时,左右指针错过,交换成错误的元素。
在递归中,一定要写成left-1以及left+1,否则如果枢纽元刚好位于最后一个位置,会陷入死循环。