簡體   English   中英

降序合並

[英]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()排除最后一個元素的方式)是應用兩個更改:

  1. MergeSort()中將終止檢查更改為

     if (1 < high - low) 
  2. 用數組的最后一個元素調用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.

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