快速排序-排序算法:快速排序【图解+代码】
热门回复:
- 炎忍:我照着 UP 写的但是运行不了,输出之后还是原样,这是我写的:
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*a = temp;
}
int partPos(int arr【】, int low, int high)
{
int i = low - 1;
int j = high;
int pivot = arr【high】;
while (1)
{
while (i < high - 1 && arr【++i】 < pivot)
;
while (j > 0 && arr【--j】 > pivot)
;
if (i < j)
{
swap(&arr【i】, &arr【j】);
}
else
{
swap(&arr【i】, &arr【high】);
break;
}
}
return i;
}
void quick(int arr【】, int low, int high)
{
if (low < high)
{
int mid = partPos(arr, low, high);
quick(arr, low, mid - 1);
quick(arr, mid + 1, high);
}
}
void quickSort(int arr【】, int n)
{
quick(arr, 0, n - 1);
}
void printArr(int arr【】, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d\n", arr【i】);
}
}
- Langthron:i是不需要判断的,因为当i走到high位置的时候 arr【i】 == pivot,即arr(++i) < pivot的条件必定不成立,循环就退出了,不会越界。
但是j要判断,因为左边的元素可能没有小于或等于pivot的值,此时 j = -1,也就越界了,这也正是up主说的极端情况:当分治的部分位于源数组的最左边,且j没有索引到比pivot小的元素时,j会越界到-1。
- 中国移不动198:[热词系列_妙啊]
- 路西法辰星z:能问一下up用的什么主题吗?
[给心心]
- 9度风:up说话真好听[星星眼]