1. 程式人生 > >2-路歸併排序(C程式碼)及其時間複雜度的具體分析

2-路歸併排序(C程式碼)及其時間複雜度的具體分析

時間複雜度:

歸併排序及其時間複雜度分析 - 瓏兒 - 顧影自憐

       這是一個遞推公式(Recurrence),我們需要消去等號右側的T(n),把T(n)寫成n的函式。其實符合一定條件的Recurrence的展開有數學公式可以套,這裡我們略去嚴格的數學證明,只是從直觀上看一下這個遞推公式的結果。當n=1時可以設T(1)=c1,當n>1時可以設T(n)=2T(n/2)+c2n,我們取c1和c2中較大的一個設為c,把原來的公式改為:

歸併排序及其時間複雜度分析 - 瓏兒 - 顧影自憐

       這樣計算出的結果應該是T(n)的上界。下面我們把T(n/2)展開成2T(n/4)+cn/2(下圖中的(c)),然後再把T(n/4)進一步展開,直到最後全部變成T(1)=c(下圖中的(d)):

歸併排序及其時間複雜度分析 - 瓏兒 - 顧影自憐

       把圖(d)中所有的項加起來就是總的執行時間。這是一個樹狀結構,每一層的和都是cn,共有lgn+1層,因此總的執行時間是cnlgn+cn,相比nlgn來說,cn項可以忽略,因此T(n)的上界是Θ(nlgn)。

       如果先前取c1和c2中較小的一個設為c,計算出的結果應該是T(n)的下界,然而推導過程一樣,結果也是Θ(nlgn)。既然T(n)的上下界都是Θ(nlgn),顯然T(n)就是Θ(nlgn)。

相關推薦

2-歸併排序C程式碼及其時間複雜具體分析

時間複雜度:        這是一個遞推公式(Recurrence),我們需要消去等號右側的T(n),把T(n)寫成n的函式。其實符合一定條件的Recurrence的展開有數學公式可以套,這裡我們略去嚴格的數學證明,只是從直觀上看一下這個遞推公式的結果。當n=1時可以設T(1)=c1,當n>1

歸併排序C語言

#include <stdio.h> #include <stdlib.h> #define N 10 void Merge(int a[],int l,int m,int h) { int i; int j; int k; int

改進的二歸併排序演算法4

文章目錄 簡述 改進辦法 執行結果 簡述   我們常見的二路歸併排序基本上分為兩步,時間複雜度為 O

歸併排序未完

注:歸併演算法是典型的分治法例項,即將一個大問題分解為n個原子問題(不可再分割),將這n個小問題解決後再逐漸合併,一般使用的是遞迴法。歸併排序是一種交穩定的排序演算法,時間複雜度固定式nlogn,但在實際操作中,其時間複雜度將會遠遠大於該值,因為在程式碼執行過程中不停的申請臨時記憶體和釋放記

快速排序的兩種方式及其時間複雜

首先快速排序是C.R.A.Hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(Divide-and-ConquerMethod)。 方法一: 該方法的基本思想是

資料結構——排序與查詢2——希爾排序C++實現

希爾排序原理 希爾排序(Shell’s Sort),也稱為“縮小增量排序”,是一種插入排序類的演算法。最簡單的插入排序,我在上一個專欄的一篇文章C++抽象程式設計——演算法分析(8)——插入排序演算法與分析有提到過,這裡就不再贅述,這裡就只介紹一些我以前沒寫過的演算法。 希爾排序是一

課程設計之四位加法計算器2C程式碼

#include<reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit rw=P2^5; sbit rs=P2^6; sbit e=P2^7; sbit led=P3

排序演算法】歸併排序C++

歸併排序的遞迴實現 C++ class MergeSort { public: int* mergeSort(int* A, int n) { // write code he

歸併排序Java程式碼實現

歸併排序歸併排序採用的是分治(divide-and-conquer)法思想。(1)基本思想:將待排序元素分成大小大致相同的2個子集合,分別對2個子集合進行排序,最終將排好序的子集合合併成為所要求的排好序的集合。 (2)執行過程:(3)演算法思路:(4)Java程式碼實現如下:

資料結構排序演算法之歸併排序c語言實現

博主身為大二萌新,第一次學習資料結構,自學到排序的時候,對於書上各種各樣的排序演算法頓覺眼花繚亂,便花了很長的時間盡力把每一個演算法都看懂,但限於水平有限,可能還是理解較淺,於是便將它們逐個地整理實現出來,以便加深理解。 歸併排序就是通過將一個具有n個key記錄的線性表,看

排序演算法:二歸併排序java

public class MergeSort { /** * * @param array 待排序陣列 * @param temp 輔助陣列 * @param start 開始下標 * @param end 結束下標

歸併排序也叫合併排序

下面這圖展示了二路歸併的過程 二路歸併的核心程式碼是merge()函式 它將2個分割的陣列有序的合併在一起 如圖: 在陣列A中, 從p到q是一個數組,從q到r是另外一個數組 那麼如何將這2個數組有序的合併在一起,組個新的陣列A呢? 步驟: 第一步:開闢一個數組L,存放p到

分治法-----歸併排序C語言描述

歸併排序的基本思想: 將兩個及其以上的有序表合併為一張有序表,把待排序序列通過分治法分為若干個有序子序列,然後每兩個子序列合併為一個子序列,經過多次合併後整合為一張有序表。 排序過程如圖: 程

演算法與資料結構2時間複雜——以歸併排序為例

這一篇文章我們首先會介紹一下歸併排序,並以歸併排序和我們上一章所說的插入排序為例,介紹時間複雜度。此係列的所有程式碼均可在我的 [github](https://github.com/AlbertShenC/Algorithm) 上找到。 [點此](https://github.com/AlbertShen

快速排序C++實現

font std clu temp secure 最重要的 esp 代碼 else 快速排序的基本實現 快速排序算法是一種基於交換的高效的排序算法,它采用了分治法的思想: 1、從數列中取出一個數作為基準數(樞軸,pivot)。 2、將數組進行劃分(partition),將

快速排序程式碼實現python3版及其時間空間複雜分析

快速排序是對氣泡排序的一種改進。基本思想是:通過一躺排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按次方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。最壞情況的時間複雜度為O(n2),最好情況時間複雜度

排序C實現

在資料結構中我們常見的排序演算法有:直接插入排序、希爾排序、選擇排序、堆排序、交換排序(氣泡排序)、快速排序、歸併排序,接下來我給大家分享一下我在寫這些程式碼時的想法(從小到大,從左到右),以及各個排序的比較 首先我們得寫一個交換函式,因為後面基本每個排序都有使用。 void Swap(in

資料結構——排序與查詢3——氣泡排序C++實現

交換排序演算法 所謂交換,意思是說根據所給的序列,對其中的兩個元素進行大小比較,若為逆序,那麼我們就交換它。這樣就達到了排序的目的。接下來介紹最簡單的交換排序——氣泡排序。 氣泡排序的原理 氣泡排序的原理很簡單,它反覆遍歷要排序的列表,比較每對相鄰的專案,如果它們的順序錯誤則

如何修改Klocwork掃描出來的問題C程式碼

下面是自己修改Klocwork掃描出來的問題的心得體會: 1、凡是malloc申請空間以後,記得考慮malloc失敗的這種情況 p=malloc() if(p==NULL)return ;   2、函式結束時,凡是malloc的,記得用free釋放,對於獲取的控制代碼指

歸併排序分治法

橫向想了一下這幾個經典的排序演算法,個人感覺快排應該是速度最快了,首先快排在空間複雜度的角度應該開銷比歸併要小很多,因為歸併需要申請新的臨時空間,時間複雜度上雖說都是N*log(n)。但是同一個數量級上歸併有很多的陣列複製操作,感覺如果資料很大的話應該比快排所消耗的時間多很多(但是都是在一個數量級上,比如10