[英]Counting Comparisions in Quicksort: Wrong answer
我已經編寫了代碼來計算在QuickSort中完成的比較次數。
每當對長度為m的數組執行快速排序時,該算法都會將比較次數增加m-1(因為會將數據透視表與自身以外的所有內容進行比較)。
樞軸的選擇始終是數組的第一個元素。
當我嘗試在10000個條目的數組上使用它時,它給我一個錯誤的答案。
正確答案應該是162085 。
指向數據集的鏈接如下: https : //drive.google.com/file/d/0B0D_kFnzj_RrYm9NT0lrM3JfN2c/view?usp=sharing
全部比較存儲在x中。
#include<stdio.h>
long long x=0;
int size=10000;
int A[10000];
int B[10000];
void quicksort(int A[],int begin,int end)
{
if(begin<end){
int i=begin;
int j=end;
int k;
int pivot=begin;
for(k=begin+1;k<=end;k++)
{
if(A[k]>A[pivot])
{
x++;
B[j]=A[k];
j--;
}
else
{
x++;
B[i]=A[k];
i++;
}
}
B[i]=A[pivot];
for(k=begin;k<=end;k++)
{
A[k]=B[k];
}
quicksort(A,begin,i-1);
quicksort(A,i+1,end);
}
else
{
if((end-begin)==1) x++;
}
}
int main()
{
FILE *myFile;
myFile = fopen("QuickSort.txt", "r");
int i;
for (i = 0; i < 10000; i++)
{
fscanf(myFile, "%d", &A[i]);
}
quicksort(A,0,size-1);
for(i=0;i<size;i++)
{
printf("%d\n",A[i]);
}
printf("%lld",x);
}
這部分是錯誤的:
for(k=begin+1;k<=end;k++)
{
if(A[k]>A[pivot])
{
x++;
B[j]=A[k];
j--;
}
else
{
x++;
B[i]=A[k];
i++;
}
}
您不必從頭到尾走。 您只應從開始到i> j。
請參閱鏈接: https : //en.wikipedia.org/wiki/Quicksort
有趣的是:
do
i := i + 1
while A[i] < pivot
do
j := j – 1
while A[j] > pivot
if i >= j then
return j
swap A[i] with A[j]
C / C ++
i = begin;
j = end;
while(true)
{
while(i< end && A[i] < A[pivot])
{
i++;
}
while(j> begin && A[j] >= A[pivot])
{
j--;
}
if(i<j)
{
int temp = A[i]; //std::swap(A[i],A[j]);
A[i] = A[j];
A[j] = temp;
else
{
break;
}
}
在此代碼中,我不使用B,因為quicksort是一種“就地”算法,因此我們不需要將結果保存到其他數組中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.