我的QuickSort代码有时会运行,但有时却不运行

时间:2016-12-25 15:16:02

标签: c algorithm data-structures quicksort

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;
    }
}

此代码有时会成功排序,但有时它不会产生任何后果并且不可阻挡地运行。我应该修复哪一部分?

2 个答案:

答案 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相同,则会生成无限循环。