生活随笔
收集整理的這篇文章主要介紹了
算法设计与分析——递归与分治——归并排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歸并排序采用的是一種分治的思想,如下圖,先將要排序的元素分為兩塊,每個塊又開始分裂,然后逐個按照特定順序合并,合成最后我們需要的數組。 歸并排序的復雜度: 時間復雜度:O(nlogn) 空間復雜度:O(n) 最好情況和最壞情況都是O(nlogn) 是一種穩定的排序方法,因為在合并的同時保證了如果相同大小,左邊的會先放進去
合并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。合并排序法是將兩個(或兩個以上)有序表合并成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然后再把有序子序列合并為整體有序序列。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序,合并排序也叫歸并排序。
函數: MergeSort()實現了歸并排序 Merge()函數 實現了將兩個段合并到一起 Copy()函數實現了將一個段復制到另一個段中去
# include <bits/stdc++.h>
using namespace std
; vector
< int > vec
;
void copy ( vector
< int > & nums
, vector
< int > & vec
, int left
, int right
) ;
void Merge ( vector
< int > & nums
, vector
< int > & vec
, int left
, int mid
, int right
) ; void MergeSort ( vector
< int > & nums
, int left
, int right
)
{ if ( left
< right
) { int mid
= ( left
+ right
) / 2 ; MergeSort ( nums
, left
, mid
) ; MergeSort ( nums
, mid
+ 1 , right
) ; Merge ( nums
, vec
, left
, mid
, right
) ; copy ( nums
, vec
, left
, right
) ; } } void Merge ( vector
< int > & nums
, vector
< int > & vec
, int left
, int mid
, int right
)
{ int i
= left
, j
= mid
+ 1 ; while ( i
<= mid
&& j
<= right
) { if ( nums
[ i
] < nums
[ j
] ) { vec
. push_back ( nums
[ i
] ) ; i
++ ; } else { vec
. push_back ( nums
[ j
] ) ; j
++ ; } } while ( i
<= mid
) { vec
. push_back ( nums
[ i
] ) ; i
++ ; } while ( j
<= right
) { vec
. push_back ( nums
[ j
] ) ; j
++ ; }
} void copy ( vector
< int > & nums
, vector
< int > & vec
, int left
, int right
)
{ int i
= left
; int k
= vec
. size ( ) ; for ( int tempK
= 0 ; ( ( tempK
< k
) && ( i
<= right
) ) ; tempK
++ ) { nums
[ i
] = vec
[ tempK
] ; i
++ ; } vec
. clear ( ) ;
} int main ( )
{ vector
< int > num1
= { 5 , 4 , 6 , 3 , 1 , 2 , 8 , 7 , 10 } ; cout
<< "before sort " << endl
; for ( auto a
: num1
) { cout
<< a
<< " " ; } MergeSort ( num1
, 0 , 8 ) ; cout
<< endl
<< "after sort " << endl
; for ( auto b
: num1
) { cout
<< b
<< " " ; } system ( "pause" ) ; return 0 ;
}
總結
以上是生活随笔 為你收集整理的算法设计与分析——递归与分治——归并排序 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。