[英]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.