程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++歸並算法

C++歸並算法

編輯:C++入門知識

C++歸並算法


#include 
using namespace std;

void DealWhat(int ar[],int start,int end,int b[])
{
    int mid = (start + end) / 2;    
    int i = start;
    int j = mid+1;
    int k = start;
    //將start到end區間劃分為兩個部分,對這兩個部分進行合並排序,每個部分應該是有序的,因為我們是從一個數字開始排序,
    //直到多個數字的排序,所以部分一定是有序的,逆向逐漸有序。
    while (i <= mid && j <= end)
    {
        if (ar[i] > ar[j])
        {
            b[k++] = ar[j];
            j++;
        }
        else
        {
            b[k++] = ar[i];
            i++;
        }

    }
    while (i <= mid)
    {
        for (; i <= mid; i++)
        {
            b[k++] = ar[i];
        }
    }
    while (j <= end)
    {
        for (; j <= end; j++)
        {
            b[k++] = ar[j];
        }
    }//以上是合並排序。
    k = 0;
    for (int m = start; m <= end; m++)
    {
        ar[m] = b[m];//ar數組的值也應該相應的變化,因為在start到end之間已經排序好了,我們只需要將排序好的覆蓋ar數組上面去,
                    //為下次遞歸排序做准備工作。     
    }
}
void Grial(int ar[],int start,int end,int b[])
{
    if (start >= end)return;
    int mid = (start + end) / 2;//每次取1/2遞歸深入。

    Grial(ar, start, mid ,b);//左邊。
    Grial(ar,mid+1, end,b);//右邊。

    DealWhat(ar,start, end,b);//處理函數,直到遞歸到單個數字。

}
int main()
{
    int a[] = {100,2,3,1,99,32,4,11,324,0};
    int *b = new int[10];
    Grial(a,0,9,b);
    for (int i = 0; i < 10; i++)
    {
        cout << b[i]<<"  " ;
    }
    cout << endl;//其實這一步數組b到這個地方就可以delete了,因為數組a也隨著排序改變,借助b這個輔助空間
                 //間接的排序原來的數組,本來可以不需要在外面傳遞b,不過我也不想修改了。
    for (int i = 0; i < 10; i++)
    {
        cout << a[i]<<"  ";
    }
    cout << endl;

    return 0;
}

感悟:
思想的重要性,如果你的思想沒有在你編程時產生火焰,即使你對別人
思想理解的再深刻,終究只是別人的東西,時間一長,你就會發現你已經
被這些看似光芒四射的東西所奴役,就會越來越累。哈哈,拙見,一起努力。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved