int partition(int list[], int left, int right) {
int low = left + 1;
int high = right;
int pivot = list[left];
while (low < high) {
while (low <= right && list[low] < pivot) {
low++;
}
while (high >= left && list[high] > pivot) {
high--;
}
if (low < high) Swap(&list[low], &list[high]);
}
Swap(&list[high], &list[left]);
return high;
}
void quicksort(int list[], int left, int right) {
if (left <= right) {
int p = partition(list, left, right);
quicksort(list, left, p - 1);
quicksort(list, p + 1, right);
}
}
void RandomNumber(int list[]) {
srand((int)time(NULL));
int i;
for (i = 0; i < 10; i++) {
list[i] = rand() % 30 + 1;
}
}
此代码有时会成功排序,但有时它不会产生任何后果并且不可阻挡地运行。我应该修复哪一部分?
答案 0 :(得分:2)
问题是当函数分区遇到只有两个元素的数组时。在这种情况下,如果第一个元素小于第二个元素,则最后一次交换调用将对数组进行洗牌。
您需要检查交换是否合理:
if( list[high] < list[left] )
{
Swap( &list[high] , &list[left] );
}
在最里面的循环中交换变量之后,还需要递增和递减变量:
if (low < high)
{
Swap(&list[low], &list[high]);
low++;
high--;
}
高位应该在左边+ 1处停止,而不是在左边:
while (high >= left &&
答案 1 :(得分:1)
您的 while (low < high) {
while (low <= right && list[low] < pivot) {
low++;
}
while (high >= left && list[high] > pivot) {
high--;
}
if (low < high) Swap(&list[low], &list[high]);
}
存在缺陷
list[low]
如果list[high]
和pivot
的值与present
相同,则会生成无限循环。