[英]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在浮點中執行其整數算術,導致各種怪異),其中“剩菜”繼續,最后一步如何處理最后一個分區(您不會是第一個跳過這里幾條記錄的人)。
這是多種語言的算法排序鏈接:
pivotIndex = rand()%20;
pivot = arr[pivotIndex];
在這里,每次您調用快速排序時,pivotIndex可能不在范圍內(低,高)。 您可以使用
pivotIndex = low+rand()%(high-low);
我確信這會生成范圍內的pivotIndex。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.