排序 歸併排序

2021-08-20 12:10:54 字數 1260 閱讀 1015

歸併排序是一種時間複雜度很優的演算法,他到底有多優下面分析了再寫,但就目前所知至少比氣泡排序要優

先來講一下歸併排序的大體思路:首先將要排序的陣列,進行拆分,但拆分為單個時,即單個子串行有序(該過程通過遞「歸」);然後再合併單個元素,得到單個有序子串行,最終得到有序序列(該過程為「並」)

畫圖來仔細分析:

歸併排序的效率是比較高的,設數列長為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例程...