|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
void quick_sort(int array[],int left,int right);
void quick_sort(int array[], int left, int right)
{
int i = left, j = right;
int temp;
int pivot;
pivot = array[(left + right) / 2];
while (i <= j)
{
//从左到右找到大于等于基准点的数
while (array[i] < pivot)
{
i++;
}
//从右到左找到小于等于基准点的数
while (array[j] > pivot)
{
j--;
}
//如果i <= j,则互换元素
if (i <= j) //为什么在这一步i,j互换元素后,pivot就会向前移动一位,成为新的pivot?是因为i++和j--嘛??(有附图)还望各路大神指点一二
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
//结束第一趟排序,开始递归
if(left < j)
{
quick_sort(array,left, j);
}
if(i < right)
{
quick_sort(array, i, right);
}
}
int main(void)
{
int array[] = { 12,3,33,23,91,34,8,24,0,61,16 };
int i, length;
length = sizeof(array) / sizeof(array[0]);
quick_sort(array, 0, length - 1);
printf("排序后的结果是:");
for (i = 0; i < length; i++)
{
printf("%d",array[i]);
putchar(' ');
}
return 0;
}
本帖最后由 耻思lhj 于 2020-4-16 09:17 编辑
1,代码就是在数组中间找一个数,赋值pivot。
2,然后从左到右,左边的数一个一个和pivot比,遇到比pivot大的数就停下来,叫a吧。然后执行下面。
3,另一边从右到左,右边的数一个一个与pivot比,遇到比pivot小的数就停下来,与之前上面的数a交换。
4,换完就继续第2步,直到j>i,在这个i和j交叉的位置的左边找不到比pivot大的数,右边找不到比pivot小的数。
然后就分成了两个部分了(一个是都小于pivot的部分,一个是都大于pivot的部分),在这两个部分里分别调用quick_sort,第一部分又从中间取个值赋值给pivot,第二部分也从中间取个值赋值给pivot(调用了两次函数)。
|
-
红色方框圈出的是不太理解的地方:pivot向前移动一位
-
这个是调试结果
|