一、总体逻辑:
1. 选基准数
2. 定义俩指针,分别指向数组的(出去基准数的)头和尾,然后相向移动。
3. 左指针找大于基准数的,右指针找小于基准数的
4. 左右指针同时找到,然后交换位置
5.做右指针重合的点和基准数互换位置,此时基准数左边全部小于基准数,基准数右边全部大于基准数
6. 对基准数左边和右边分别进行快速排序
二、解释:
1. 选基准数,以第一个为基准数
2. 通过前面的 “对基准数左边和右边分别进行快速排序” ,可看出,很显然要用递归,虽然内存消耗大吧,但是它代码简洁嘛
3. ”左右指针相向移动“ 中的相向不是相同方向的意思奥,而是:
4. 然后左指针找到大于基准数的数,并且右指针找到小于基准数的数时,两个指针交换他们找到的数值,即:
三、接着就是循环:
1. 递归没什么好讲的,就是传参的时候记得是动态的。
四、代码附上:
#include <stdio.h>
void printArr(int *arr, int len)
{
for (int i = 0; i < len; i++)
printf("%d ", arr[i]);
printf("\n");
}
void quickSort_circulation(int *arr, int i, int j)
{
// 左指针
int start = i;
// 右指针
int end = j;
if (start > end)
{
return;
}
// 基准数
int baseNum = arr[i];
// 循环寻找
while (start != end)
{
// 右指针寻找小于基准数的
while (1)
{
if (end <= start || arr[end] < baseNum)
break;
end--;
}
// 左指针寻找大于基准数的
while (1)
{
if (end <= start || arr[start] > baseNum)
break;
start++;
}
// 将两个指针指向的元素交换位置
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
// 基准数归位
int temp = arr[i];
arr[i] = arr[start];
arr[start] = temp;
// 对基准数左边的数组进行快速排序
quickSort_circulation(arr, i, start - 1);
// 对基准数右边的数组进行快速排序
quickSort_circulation(arr, start + 1, j);
}
void main()
{
int arr1[] = {5, 6, 2, 9, 8, 7, 3, 1, 4};
int len = sizeof(arr1) / sizeof(int);
printf("排序前:\n");
printArr(arr1, len);
quickSort_circulation(arr1, 0, len - 1);
printf("排序后:\n");
printArr(arr1, len);
}