void _QuickSort(int arr[], int left, int right)
{
if (left == right){
return;//只有一个数,已经有序
}
if (left > right){
return;//没有数,不需要排序
}
int div = Partition_01(arr, left, right);//分成左右小区间[left,div-1];[div+1,right]
_QuickSort(arr, left, div - 1);
_QuickSort(arr, div + 1, right);
}
void QuickSort(int arr[], int size)
{
_QuickSort(arr, 0, size - 1);
}
比基准值小的放左,大的放右,有三种方式
<1>.hover法 (左右指针)时间复杂度:O(n)
int Partition_01(int arr[], int left, int right)
{
int begin = left;//不是0
int end = right;//不是right-1
while (begin < end){
//如果基准值在最右边,想先动begin
//arr[begin]要<=不能<
while (begin<end && arr[begin] <= arr[right]){
begin++;
}
while (begin < end && arr[end] >= arr[right]){
end--;
}
Swap(arr + begin, arr + end);
}
Swap(arr + begin, arr + end);
return begin;
}
<2>.挖坑法
找个变量pivot存基准值,则需要交换的值的位置为坑,直接可以换过来
begin,end对应的即为坑
int Partition_02(int arr[], int left, int right)
{
int begin = left;//不是0
int end = right;//不是right-1
int pivot = arr[right];//保存基准值
while (begin < end){
//如果基准值在最右边,想先动begin
//arr[begin]要<=不能<
while (begin<end && arr[begin] <= pivot){
begin++;
}
arr[end] = arr[begin];
while (begin < end && arr[end] >= pivot){
end--;
}
arr[begin] = arr[end];
}
arr[begin] = pivot;
return begin;
}
<3>.左右指针法
int Partition_03(int arr[], int left, int right)
{
int cur = left;
int div = left;
for (cur = left, div = left; cur < right; cur++)
{
if (arr[cur] < arr[right])
{
Swap(arr + cur, arr + div);
div++;
}
}
Swap(arr + div, arr + right);
}