[英]Descending Mergesort
我寫了一些代碼來執行降序的合並排序。
void Merge(int a[], int low, int high, int mid)
{
int i=low,j=mid+1,k=0;
int temp[high-low+1];
while(i<=mid && j<= high)
{
if(a[i]>a[j]) //comparison step
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=mid)
{
temp[k++]=a[i++];
}
while(j<=high)
{
temp[k++]=a[j++];
}
for(i=low;i<=high;i++)
{
a[i]=temp[i-low];
}
return;
}
void MergeSort(int a[],int low, int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
MergeSort(a,low,mid);
MergeSort(a,mid+1,high);
Merge(a,low,high,mid);
}
return;
}
void output(int *a,int n)
{
for(int i=0;i<n;i++)
{
cout<<a[i]<<"\t";
}
}
int main()
{
int n=12;
int a[n]={23,45,1,2,8,0,9,56,73,5070,20,16};
MergeSort(a,0,n);
output(a,n);
}
該代碼在升序(即)時可以完美地工作。 比較是a [i] <a [j]
但是,通過使用a [j]> a [i] MergeSort眾生按降序排序,但是它會在數組的開頭包含一些隨機的大數。 我真的不知道為什么會這樣。
C ++中的數組從零開始。 但是,您的代碼會愉快地訪問a[high]
,該值傳遞了值12
。 因此,您可以無限制地訪問。 如果對數組進行升序排序,則會發生相同的錯誤,但是由於您不打印a[12]
(您的output()
函數使用的范圍不包括n
),因此您看不到它。
我強烈建議采用一種編程風格,其中范圍包括開始值和獨家端值。 當然,無論如何我還是建議對范圍而不是索引使用迭代器。 對於這些而言,約定更為明顯。
快速解決方案(不會改變您的MergeSort()
排除最后一個元素的方式)是應用兩個更改:
在MergeSort()
中將終止檢查更改為
if (1 < high - low)
用數組的最后一個元素調用MergeSort()
MergeSort(a, 0, n - 1);
注意,可變尺寸的內置陣列狀int temp[high - low + 1]
是不標准的C ++,即使它們是由一些編譯器作為擴展支持(例如,部分g++
)。 對於更大的數組,它們也將引起問題,因為它們勢必會溢出堆棧。 您最好使用std::vector<int>
:
std::vector<int> temp(high - low + 1);
對於測試數組,您可以使用靜態大小的數組,由編譯器為其確定大小,並讓編譯器也確定該數組:
int a[]={23,45,1,2,8,0,9,56,73,5070,20,16};
int n = std::end(a) - std::begin(a); // need <iterator> to be included
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.