最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

數(shù)據(jù)結(jié)構(gòu)之歸并排序的實(shí)例詳解

 更新時(shí)間:2017年08月31日 08:46:42   投稿:lqh  
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之歸并排序的實(shí)例詳解的相關(guān)資料,這里對(duì)歸并排序進(jìn)行詳細(xì)介紹,需要的朋友可以參考下

歸并排序

基本思想                                                                                                

歸并排序是建立在二路歸并和分治法的基礎(chǔ)上的一個(gè)高效排序算法,將已有序的子序列合并,得到完全有序的序列;即先使每個(gè)子序

列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為二路歸并。

將待排序序列R[0...n-1]看成是n個(gè)長度為1的有序序列,將相鄰的有序表成對(duì)歸并,得到n/2個(gè)長度為2的有序表;將這些有序序列

再次歸并,得到n/4個(gè)長度為4的有序序列;如此反復(fù)進(jìn)行下去,最后得到一個(gè)長度為n的有序序列。所以呢,我們總結(jié)一下歸并排序

其實(shí)就只有兩步:

分解:將有序序列不斷地分裂,直到每個(gè)區(qū)間都只有一個(gè)數(shù)據(jù)為止.

合并:將兩個(gè)區(qū)間合并為一個(gè)有序的區(qū)間,一直合并知道只有一個(gè)區(qū)間為止.

圖是我偷來的,但是學(xué)習(xí)是認(rèn)真的.

分解的過程我們很容易想明白的,用遞歸就可以.但是我們今天最主要的步驟是合并,你要將兩個(gè)區(qū)間合并為一個(gè)有序的區(qū)間你會(huì)怎么思考呢?

這個(gè)非常簡單,只要從比較二個(gè)數(shù)列的第一個(gè)數(shù),誰小就先取誰,取了后就在對(duì)應(yīng)數(shù)列中刪除這個(gè)數(shù)。然后再進(jìn)行比較,如果有數(shù)

列為空,那直接將另一個(gè)數(shù)列的數(shù)據(jù)依次取出即可。

代碼實(shí)現(xiàn):

//將有序數(shù)組a[]和b[]合并到c[]中  
void MemeryArray(int a[], int n, int b[], int m, int c[])  
{  
  int i, j, k;  
  
  i = j = k = 0;  
  while (i < n && j < m)  
  {  
    if (a[i] < b[j])  
      c[k++] = a[i++];  
    else  
      c[k++] = b[j++];   
  }  
  
  while (i < n)  
    c[k++] = a[i++];  
  
  while (j < m)  
    c[k++] = b[j++];  
}  

其實(shí)我們發(fā)現(xiàn)這種做法效率其實(shí)還是蠻高的,效率達(dá)到了O(N).現(xiàn)在我們解決了合并的問題.

現(xiàn)在總的來看一下歸并排序的做法,通過先遞歸的分解數(shù)列(將數(shù)列分解成只有一個(gè)元素的區(qū)間),再合并數(shù)列就完成了歸并排序。

代碼實(shí)現(xiàn)                                                                                                 

//將有二個(gè)有序數(shù)列a[first...mid]和a[mid...last]合并。  
void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
  int i = first, j = mid + 1;  
  int m = mid,  n = last;  
  int k = 0;  
    
  while (i <= m && j <= n)  
  {  
    if (a[i] <= a[j])  
      temp[k++] = a[i++];  
    else  
      temp[k++] = a[j++];  
  }  
    
  while (i <= m)  
    temp[k++] = a[i++];  
    
  while (j <= n)  
    temp[k++] = a[j++];  
    
  for (i = 0; i < k; i++)  
    a[first + i] = temp[i];  
}  
void mergesort(int a[], int first, int last, int temp[])  
{  
  if (first < last)  
  {  
    int mid = (first + last) / 2;  
    mergesort(a, first, mid, temp);  //左邊有序  
    mergesort(a, mid + 1, last, temp); //右邊有序  
    mergearray(a, first, mid, last, temp); //再將二個(gè)有序數(shù)列合并  
  }  
}  
  
bool MergeSort(int a[], int n)  
{  
  int *p = new int[n];  
  if (p == NULL)  
    return false;  
  mergesort(a, 0, n - 1, p);  
  delete[] p;  
  return true;  
}  



總結(jié)                                                                                                  

歸并排序的效率是比較高的,設(shè)數(shù)列長為N,將數(shù)列分開成小數(shù)列一共要logN步,每步都是一個(gè)合并有序數(shù)列的過程,時(shí)間復(fù)雜度

可以記為O(N),故一共為O(N*logN)。因?yàn)闅w并排序每次都是在相鄰的數(shù)據(jù)中進(jìn)行操作,所以歸并排序在O(N*logN)的幾種排序方

法(快速排序,歸并排序,希爾排序,堆排序)也是效率比較高的。

算法名稱  最差時(shí)間復(fù)雜度  平均時(shí)間復(fù)雜度  最優(yōu)時(shí)間復(fù)雜度  空間復(fù)雜度  穩(wěn)定性

歸并排序    O(NlogN)    O(NlogN)              O(NlogN)       O(n)        穩(wěn)定

所有排序當(dāng)中用的最多的就是堆排序,快速排序,歸并排序.

若從空間復(fù)雜度來考慮:首選堆排序,其次是快速排序,最后是歸并排序。

若從穩(wěn)定性來考慮,應(yīng)選取歸并排序,因?yàn)槎雅判蚝涂焖倥判蚨际遣环€(wěn)定的。

若從平均情況下的排序速度考慮,應(yīng)該選擇快速排序。

以上就是數(shù)據(jù)結(jié)構(gòu)中歸并排序的實(shí)例詳解,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • C++定時(shí)器Timer在項(xiàng)目中的使用方法

    C++定時(shí)器Timer在項(xiàng)目中的使用方法

    這篇文章主要給大家介紹了關(guān)于C++定時(shí)器Timer在項(xiàng)目中的基本使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • c語言和c++語言中const修飾的變量區(qū)別淺析

    c語言和c++語言中const修飾的變量區(qū)別淺析

    這篇文章主要給大家介紹了關(guān)于c語言和c++語言中const修飾的變量區(qū)別的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C和C++的區(qū)別詳解

    C和C++的區(qū)別詳解

    這篇文章主要介紹了C和C++之間的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • C++模擬實(shí)現(xiàn)string的示例代碼

    C++模擬實(shí)現(xiàn)string的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C++模擬實(shí)現(xiàn)string的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定的幫助,需要的可以參考一下
    2022-11-11
  • C++ 轉(zhuǎn)換函數(shù)用法案例詳解

    C++ 轉(zhuǎn)換函數(shù)用法案例詳解

    這篇文章主要介紹了C++ 轉(zhuǎn)換函數(shù)用法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Matlab實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)顯示方法

    Matlab實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)顯示方法

    這篇文章主要為大家詳細(xì)介紹了Matlab使用Plot函數(shù)實(shí)現(xiàn)數(shù)據(jù)動(dòng)態(tài)顯示方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Qt編寫地圖之實(shí)現(xiàn)覆蓋物坐標(biāo)和搜索

    Qt編寫地圖之實(shí)現(xiàn)覆蓋物坐標(biāo)和搜索

    地圖應(yīng)用中經(jīng)常會(huì)需要有覆蓋物坐標(biāo)和搜索的功能,本文將利用Qt實(shí)現(xiàn)這一功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-03-03
  • C++?超詳細(xì)講解stack與queue的使用

    C++?超詳細(xì)講解stack與queue的使用

    C++?Stack(堆棧)?是一個(gè)容器類的改編,為程序員提供了堆棧的全部功能,也就是說實(shí)現(xiàn)了一個(gè)先進(jìn)后出(FILO)的數(shù)據(jù)結(jié)構(gòu),許多程序都使用了?queue?容器。queue?容器可以用來表示超市的結(jié)賬隊(duì)列或服務(wù)器上等待執(zhí)行的數(shù)據(jù)庫事務(wù)隊(duì)列
    2022-03-03
  • C語言模式實(shí)現(xiàn)C++繼承和多態(tài)的實(shí)例代碼

    C語言模式實(shí)現(xiàn)C++繼承和多態(tài)的實(shí)例代碼

    本篇文章主要介紹了C語言模式實(shí)現(xiàn)C++繼承和多態(tài)的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • C++實(shí)現(xiàn)LeetCode(77.Combinations 組合項(xiàng))

    C++實(shí)現(xiàn)LeetCode(77.Combinations 組合項(xiàng))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(Combinations 組合項(xiàng)),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

甘德县| 新兴县| 沧州市| 渝中区| 柳林县| 治多县| 岳阳县| 泰宁县| 阳谷县| 泾源县| 沙雅县| 石屏县| 奉节县| 布尔津县| 多伦县| 潮州市| 诸城市| 盐池县| 宁安市| 津市市| 华宁县| 武威市| 大安市| 长春市| 深圳市| 九龙县| 普洱| 平阳县| 浦城县| 济宁市| 娱乐| 东台市| 临高县| 防城港市| 宣恩县| 柳州市| 清原| 通辽市| 伊春市| 筠连县| 荆州市|