簡體   English   中英

尋找隨機QuickSort中的麻煩(樞軸是隨機數)

[英]Finding hassle in Randomized QuickSort(Where pivot is a random number)

int partition(int arr[], int low, int up)
{
    int temp,i,j,pivot,k,swap;
    i=low+1;
    j=up;
    k=(rand() % (up + 1 - low)) + low;

    pivot=arr[k];
    swap=arr[low];
    arr[low]=arr[k];
    arr[k]=swap;    
    while(i<=j)
    {
        while((arr[i] < pivot) && (i < up))
        {
            i++;
        }
        while(arr[j] > pivot)
        {
            j++;
        }
        if(i < j)
        {
            temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
            i++;
            j--;
        }
        else
        {
            i++;
        }

    }
    arr[low]=arr[j];
    arr[j]=pivot;
    return j;

}

我不知道我的代碼有什么問題,但是它不起作用。 當我輸入3,2,4作為輸入時,彈出一個Windows對話框“ RandQck.exe停止工作。問題導致程序停止正常工作”。 現在,我在本節中做了一些修改,即

swap=arr[low];
arr[low]=arr[k];
arr[k]=swap;
pivot=arr[low];

給定輸入3、2、4,輸出為3、3、3。 我知道這個問題還很幼稚,但請幫助找出問題,並在可能的情況下予以糾正。 其余部分,即main,Quick功能正確。 問題僅在於分區功能。

這很可能導致程序崩潰:

while(arr[j] > pivot){
    j++;
}

變量j用up初始化,並不斷增加並超出數組的范圍。

這是我使用的分區函數(C ++),您可以使用隨機初始樞軸來實現:

int partition(int* arr, int l, int u){
    int flag=0;
     int p = l; //I have initialized pivot with l, but it you can  choose a random value as well.
    while(l<u){
        if(flag == 0){
            while(arr[u]>arr[p]) u--;
            swap(&arr[u], &arr[p]);
            flag=1;
            p=u;
        }
        else if(flag == 1){
            while(arr[l]<arr[p]) l++;
            swap(&arr[l], &arr[p]);
            flag=0;
            p=l;
        }
    }
    return p;
}
  while(arr[j] > pivot)
        {
            j++;
        }

這是問題所在。 j ++使數組脫離索引。 將其設為j--。

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

暫無
暫無

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

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