hoare法
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int Part_Sort(int* arr,int left,int right)
{
int key = arr[left];//选取左边第一个为基准值
int keyi = left;
while (left<right)
{
//为什么要right先移动?
//首先我们的基本思想是让小于基准值的元素都放到左边,大于基准值的元素都放到右边;
//因为right找小于key的值,如果left先移动的话,当left停下来,然后right移动最后相遇的时候,
//很可能right一口气跑到了left的位置导致arr[right]>key,
//如果交换的话,则不符合快排思想。
while (left < right && arr[right] >= key) right--;//只要right停下来,arr[right]不是小于key就是left和right相遇了;
while (left < right && arr[left] <= key) left++;//只要left停下来,arr[left]不是大于key就是left和right相遇了;
if(left!=right) swap(&arr[left], &arr[right]); //left==right没必要交换
}
if (right!=keyi) swap(&arr[right],&arr[keyi]);//确认最后left确实移动了,即left!=keyi;
return right;
}
//时间复杂度O(nlogn),空间复杂度O(1)
void Quick_Sort(int* arr, int left,int right)
{
if (left >= right) return;
int keyi = Part_Sort(arr, left, right);//返回值是left和right相遇的下标;
//优化,三数取中;
Quick_Sort(arr,left,keyi-1);
Quick_Sort(arr,keyi+1,right);
}
int main()
{
int array[10] = { 10,9,8,7,6,5,4,3,2,1 };
Quick_Sort(array,0,9);
for (auto& e : array)
{
std::cout << e << std::endl;
}
return 0;
}