歸併排序是一種時間複雜度很優的演算法,他到底有多優下面分析了再寫,但就目前所知至少比氣泡排序要優
先來講一下歸併排序的大體思路:首先將要排序的陣列,進行拆分,但拆分為單個時,即單個子串行有序(該過程通過遞「歸」);然後再合併單個元素,得到單個有序子串行,最終得到有序序列(該過程為「並」)
畫圖來仔細分析:
歸併排序的效率是比較高的,設數列長為n,將數列分開成小數列一共要logn步,每步都是乙個合併有序數列的過程,時間複雜度可以記為o(n),故一共為o(n*logn)
通過這幅圖的分析,我們可以得到歸併排序的時間複雜度為o(n*logn),而氣泡排序的時間複雜度為o(n*n)。
整體思路是有了,可是它的遞迴過程還是有必要分析一下的:
為了說明問題我只花了它的流程的一半,其它的也是一樣的。
下面我們將整個思考過程通過**來實現一下:
1.先寫合併兩的子串行的函式
void mergearray(int* a,int bigen,int mid,int end,int* temp)//合併
//陣列[bigen...mid]和陣列[mid+1 ... end]
while(b1<=e1)
temp[k++] = a[b1++];
while(b2<=e2)
temp[k++] = a[b2++];
//將a陣列分出去的元素,並合併好的順序元素段,還會a對應的位置
for(int i = 0;i2.核心部分,歸併遞迴控制
void mergesort(int* a,int bigen,int end,int* temp)
}
3.歸併排序**:void mergesort(int* a, int n)
4.用來測試的主函式:int main()
; const int n = 10;
mergesort(a,n);
for(int i = 0;iprintf("%d ",a[i]);
printf("\n");
return
0;}
我相信通過上面的畫圖分析和**的詳細注釋結合,這個算應該可以理解吧!! 排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...
排序 歸併排序
利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...