方法1:前面放一个指针的方法
void quick(int *arr, int len, int start, int end)
{
int low = start;
for (int i = start + 1; i < end + 1; i++)
{
if (arr[i] < arr[start]){
low++;
if (low != i){
swap(&arr[low], &arr[i]);
}
}
}
swap(&arr[low], &arr[start]);
if (low-1 > start)
quick(arr, len, start, low - 1);
if (low+1 < end)
quick(arr, len, low+1, end);
}
void sort_quick(int *arr, int len)
{
quick(arr, len, 0, len - 1);
}
方法2:前后指针交换法
//快速排序
void Sort_Quick(int* arr, int low, int high)
{
if (low >= high)
return;
int temp = arr[low];//中间参考值
int b = low+1;//从第二个值开始,第一个值作为中间值
int e = high;
while (b <=e)
{
while (arr[b] <= temp && b <= e)//找到左边值大于参考值
b++;
while (arr[e] >= temp && b <= e)//找到右边值小于参考值
e--;
if (b<e)//位置相同和位置交叉不交换
{
Sort_swap(arr[b], arr[e]);//对应下表值交换
b++;
e--;
}
}
arr[low] = arr[e];//所有大于参考值的左一个值
arr[e] = temp;//参考值去到对应位置
Sort_Quick(arr, low, e - 1);//分割
Sort_Quick(arr, e + 1, high);
}
void Sort_Quick(int* arr, int len)
{
printf("快速排序法\n");
Sort_Quick(arr, 0, len - 1);
// cout << Sort_check(arr, len) << endl;
}
方法3:前后轮流交换法
void quick(int *arr,int start, int end)
{
if(start>=end) return;
// 设置基准key
int key = arr[start];
int l = start;
int h = end;
while(l<h)
{
while(l<h && key >= arr[h])
h--;
arr[l] = arr[h];
while(l<h && key <= arr[l])
l++;
arr[h] = arr[l];
}
arr[l] = key;
// 分割数组(逻辑上)
quick(arr,start,l-1);
quick(arr,l+1,end);
}
// 快速排序
void sortQuick(int *arr, int len)
{
quick(arr,0,len-1);
}