簡體   English   中英

Quicksort陷入無限循環

[英]Quicksort going in infinite loop

我正在嘗試為quicksort編寫代碼,但是它一直在無限循環中進行,我努力嘗試在以下代碼中查找錯誤,任何人都可以幫忙。

#include<stdio.h>
#include<stdlib.h>

int arr[100];

void quicksort(int low,int high)
{
    int i = low,j = high,pivotIndex,pivot;
    pivotIndex = rand()%20;
    pivot = arr[pivotIndex];

    if(i>=j)
        return;

    while(i<j)
    {

        while(arr[i]<pivot && i<j)
        {
            i++;
        }

        while(arr[j]>pivot && j>i)
        {
            j--;
        }

        if(i<j)
        {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }

    }
    quicksort(low,i);
    quicksort(i+1,high);
}

int main()
{
    int i,j,temp;

    for(i=0;i<20;i++)
        arr[i] = rand()%21;

    for(i=0;i<20;i++)
        printf("%d ",arr[i]);
    printf("\n");

    quicksort(0,19);

    for(i=0;i<20;i++)
            printf("%d ",arr[i]);
    printf("\n");

    return 0;
}

您選擇的樞軸是錯誤的,您應該選擇(索引)范圍[low,high)內的樞軸,而選擇[0,20)范圍內的樞軸:

pivotIndex = rand()%20;

稍后將使分區運行不正常,並且稍后用於遞歸的i的值將是錯誤的。


編輯:

分區的另一個問題是,分區還應該考慮如何處理數據透視元素及其重復項-應該有某種“搶斷者”-數據透視應該移到數組的一側(或其他方式)。
例如,假設樞軸為5 ,數組為[5,3,8,5]
您將無限地反復交換5,這是絕對錯誤的。

作為排序插件的作者,我可以向您保證,重新發明這些算法確實可以使您陷入困境。 ; O)

必須特別注意(如前所述)選擇樞軸,算術將如何影響樞軸值(例如,VBA在浮點中執行其整數算術,導致各種怪異),其中“剩菜”繼續,最后一步如何處理最后一個分區(您不會是第一個跳過這里幾條記錄的人)。

這是多種語言的算法排序鏈接:

http://rosettacode.org/wiki/Sorting_algorithms/Quicksort

 pivotIndex = rand()%20;
 pivot = arr[pivotIndex];

在這里,每次您調用快速排序時,pivotIndex可能不在范圍內(低,高)。 您可以使用

pivotIndex = low+rand()%(high-low);

我確信這會生成范圍內的pivotIndex。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM