欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

歸并排序的實現(xiàn)代碼與思路

 更新時間:2013年03月22日 09:51:00   作者:  
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。

首先考慮下如何將將二個有序數(shù)列合并。這個非常簡單,只要從比較二個數(shù)列的第一個數(shù),誰小就先取誰,取了后就在對應數(shù)列中刪除這個數(shù)。然后再進行比較,如果有數(shù)列為空,那直接將另一個數(shù)列的數(shù)據(jù)依次取出即可。

復制代碼 代碼如下:

View Code
 //將有序數(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ù)列的效率是比較高的,可以達到O(n)。

解決了上面的合并有序數(shù)列問題,再來看歸并排序,其的基本思路就是將數(shù)組分成二組A,B,如果這二組組內(nèi)的數(shù)據(jù)都是有序的,那么就可以很方便的將這二組數(shù)據(jù)進行排序。如何讓這二組組內(nèi)數(shù)據(jù)有序了?

可以將A,B組各自再分成二組。依次類推,當分出來的小組只有一個數(shù)據(jù)時,可以認為這個小組組內(nèi)已經(jīng)達到了有序,然后再合并相鄰的二個小組就可以了。這樣通過先遞歸的分解數(shù)列,再合并數(shù)列就完成了歸并排序。

復制代碼 代碼如下:

View Code
 //將有二個有序數(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); //再將二個有序數(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;
 }

歸并排序的效率是比較高的,設數(shù)列長為N,將數(shù)列分開成小數(shù)列一共要logN步,每步都是一個合并有序數(shù)列的過程,時間復雜度可以記為O(N),故一共為O(N*logN)。因為歸并排序每次都是在相鄰的數(shù)據(jù)中進行操作,所以歸并排序在O(N*logN)的幾種排序方法(快速排序,歸并排序,希爾排序,堆排序)也是效率比較高的

相關文章

  • MyBatis-Plus聯(lián)表查詢(Mybatis-Plus-Join)的功能實現(xiàn)

    MyBatis-Plus聯(lián)表查詢(Mybatis-Plus-Join)的功能實現(xiàn)

    mybatis-plus作為mybatis的增強工具,簡化了開發(fā)中的數(shù)據(jù)庫操作,這篇文章主要介紹了MyBatis-Plus聯(lián)表查詢(Mybatis-Plus-Join),需要的朋友可以參考下
    2022-08-08
  • SSM框架中測試單元的使用 spring整合Junit過程詳解

    SSM框架中測試單元的使用 spring整合Junit過程詳解

    這篇文章主要介紹了SSM框架中測試單元的使用 spring整合Junit過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Java之線程編程的4種方法實現(xiàn)案例講解

    Java之線程編程的4種方法實現(xiàn)案例講解

    這篇文章主要介紹了Java之線程編程的4種方法實現(xiàn)案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java中的ThreadLocal與ThreadLocalMap詳解

    Java中的ThreadLocal與ThreadLocalMap詳解

    這篇文章主要介紹了Java中的ThreadLocal與ThreadLocalMap詳解,ThreadLocal 是一個線程局部變量,其實的功用非常簡單,就是為每一個使用該變量的線程都提供一個變量值的副本,是Java中一種較為特殊的線程綁定機制,需要的朋友可以參考下
    2023-09-09
  • log4j與slf4j的使用與區(qū)別詳解

    log4j與slf4j的使用與區(qū)別詳解

    這篇文章主要介紹了log4j與slf4j的使用與區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Mybatis中TypeHandler使用小結

    Mybatis中TypeHandler使用小結

    MyBatis的TypeHandler是一個強大的機制,它為我們提供了一種靈活的方式來處理Java類型與數(shù)據(jù)庫類型之間的轉(zhuǎn)換,本文主要介紹了Mybatis中TypeHandler使用小結,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • SSO單點登錄系統(tǒng)實現(xiàn)原理及流程圖解

    SSO單點登錄系統(tǒng)實現(xiàn)原理及流程圖解

    這篇文章主要介紹了SSO單點登錄系統(tǒng)實現(xiàn)原理及流程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • Java中利用gson解析Json實例教程

    Java中利用gson解析Json實例教程

    這篇文章主要給大家介紹了關于Java中利用gson解析Json 的相關資料,文中給出了詳細的示例代碼供大家參考學習,相信對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Spring框架 XML配置事務控制的步驟操作

    Spring框架 XML配置事務控制的步驟操作

    這篇文章主要介紹了Spring框架 XML配置事務控制的步驟操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳解Spring 兩種注入的方式(Set和構造)實例

    詳解Spring 兩種注入的方式(Set和構造)實例

    本篇文章主要介紹了Spring 兩種注入的方式(Set和構造)實例,Spring框架主要提供了Set注入和構造注入兩種依賴注入方式。有興趣的可以了解一下。
    2017-02-02

最新評論