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

C++實(shí)現(xiàn)自底向上的歸并排序算法

 更新時(shí)間:2015年12月11日 10:49:29   作者:NW_KNIFE  
這篇文章主要介紹了C++實(shí)現(xiàn)自底向上的歸并排序算法,結(jié)合實(shí)例形式較為詳細(xì)的分析總結(jié)了自底向上的歸并排序算法的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下

本文實(shí)例講述了C++實(shí)現(xiàn)自底向上的歸并排序算法。分享給大家供大家參考,具體如下:

一. 算法描述

自底向上的歸并排序:歸并排序主要是完成將若干個(gè)有序子序列合并成一個(gè)完整的有序子序列;自底向上的排序是歸并排序的一種實(shí)現(xiàn)方式,將一個(gè)無序的N長數(shù)組切個(gè)成N個(gè)有序子序列,然后再兩兩合并,然后再將合并后的N/2(或者N/2 + 1)個(gè)子序列繼續(xù)進(jìn)行兩兩合并,以此類推得到一個(gè)完整的有序數(shù)組。下圖詳細(xì)的分解了自底向上的合并算法的實(shí)現(xiàn)過程:

二. 算法實(shí)現(xiàn)

/*=============================================================================
#
#   FileName:  mergeSort.c
#   Algorithm: 歸并排序(自底向上)
#   Author:   Knife
#   Created:  2014-06-14 16:40:02
#
=============================================================================*/
#include<stdio.h>
#include<stdlib.h>
void merge_sort(int* intArr, int intArr_len);
void merge_array(int* intArr1, int len1, int* intArr2, int len2);
void main(){
  int intArr[] = {8,3,6,4,2,9,5,4,1,7};
  int n = sizeof (intArr) / sizeof (intArr[0]);
  int i = 0;
  merge_sort(intArr, n);
  for(;i<n;i++){
    printf("%d ",intArr[i]);
  }
  printf("\n");
}
//歸并排序(自底向上)
void merge_sort(int* intArr, int intArr_len){
  int len = 1;
  int k = 0;
  while (len < intArr_len) { 
    int i = 0; 
    for (; i + 2*len <= intArr_len; i += 2*len){
      int* intArr1 = intArr + i;
      int intArr1_len = len;
      int* intArr2 = intArr + i + len;
      int intArr2_len = len;
      merge_array(intArr1, intArr1_len, intArr2, intArr2_len); 
    }
    if (i + len <= intArr_len){ 
      int* intArr1 = intArr + i;
      int intArr1_len = len;
      int* intArr2 = intArr + i + len;
      int intArr2_len = intArr_len - i - len;
      merge_array( intArr1, intArr1_len, intArr2, intArr2_len); 
    }
    len *= 2;  //有序子序列長度*2 
  } 
}
//合并兩個(gè)數(shù)組,并排序
void merge_array(int* intArr1, int len1, int* intArr2, int len2){
  //申請(qǐng)分配空間
  int* list = (int*) malloc((len1+len2) * sizeof (int));
  int i = 0, j = 0, k = 0;
  while(i < len1 && j < len2){
     // 把較小的那個(gè)數(shù)據(jù)放到結(jié)果數(shù)組里, 同時(shí)移動(dòng)指針
    list[k++] = (intArr1[i] < intArr2[j]) ? intArr1[i++] : intArr2[j++];
  }
  // 如果 intArr1 還有元素,把剩下的數(shù)據(jù)直接放到結(jié)果數(shù)組
  while(i < len1){
    list[k++] = intArr1[i++];
  }
  // 如果 intArr2 還有元素,把剩下的數(shù)據(jù)直接放到結(jié)果數(shù)組
  while(j < len2){
    list[k++] = intArr2[j++];
  }
   // 把結(jié)果數(shù)組 copy 到 intArr1 里
  for(i = 0; i < k; i++){
    intArr1[i] = list[i];
  }
  //釋放申請(qǐng)的空間
  free(list);
}

三. 算法分析

平均時(shí)間復(fù)雜度:O(nlog2n)
空間復(fù)雜度:O(n)  (用于存儲(chǔ)有序子序列合并后有序序列)
穩(wěn)定性:穩(wěn)定

希望本文所述對(duì)大家C++程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Libevent的使用及reactor模型詳解

    Libevent的使用及reactor模型詳解

    Libevent?是一個(gè)用C語言編寫的、輕量級(jí)的開源高性能事件通知庫,主要有以下幾個(gè)亮點(diǎn):事件驅(qū)動(dòng)(?event-driven),高性能;輕量級(jí),專注于網(wǎng)絡(luò),這篇文章主要介紹了Libevent的使用及reactor模型,需要的朋友可以參考下
    2024-03-03
  • C/C++ProtoBuf使用小結(jié)

    C/C++ProtoBuf使用小結(jié)

    ProtoBuf全稱:protocol buffers,直譯過來是:“協(xié)議緩沖區(qū)”,是一種與語言無關(guān)、與平臺(tái)無關(guān)的可擴(kuò)展機(jī)制,用于序列化結(jié)構(gòu)化數(shù)據(jù),這篇文章主要介紹了C/C++ProtoBuf使用,需要的朋友可以參考下
    2024-01-01
  • ?C++中assign函數(shù)的使用

    ?C++中assign函數(shù)的使用

    在C++標(biāo)準(zhǔn)模板庫中,std::list等容器都提供了assign成員函數(shù),它比操作符更靈活,支持多種初始化方式,下面就來介紹一下assign的用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-07-07
  • C++中string與int的相互轉(zhuǎn)換實(shí)現(xiàn)代碼

    C++中string與int的相互轉(zhuǎn)換實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++中string與int的相互轉(zhuǎn)換實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-05-05
  • C語言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)

    C語言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)

    qsort函數(shù)是由C語言提供的標(biāo)準(zhǔn)庫函數(shù), 它的實(shí)現(xiàn)思想是快速排序。這篇文章主要介紹了C語言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)qsort函數(shù)功能,需要的可以參考一下
    2022-10-10
  • C++實(shí)現(xiàn)一個(gè)封裝的雙鏈表的完整代碼

    C++實(shí)現(xiàn)一個(gè)封裝的雙鏈表的完整代碼

    雙鏈表是鏈表的一種變種,除了每個(gè)節(jié)點(diǎn)指向下一個(gè)節(jié)點(diǎn)外,還多了一個(gè)指向前一個(gè)節(jié)點(diǎn)的指針,由于雙鏈表可以從兩端進(jìn)行遍歷,它的插入和刪除操作更為靈活,本文將詳細(xì)介紹如何使用 C++ 語言實(shí)現(xiàn)一個(gè)封裝的雙鏈表類,需要的朋友可以參考下
    2025-07-07
  • C++實(shí)現(xiàn)LeetCode(52.N皇后問題之二)

    C++實(shí)現(xiàn)LeetCode(52.N皇后問題之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(52.N皇后問題之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 利用c語言實(shí)現(xiàn)卷積碼編碼器示例

    利用c語言實(shí)現(xiàn)卷積碼編碼器示例

    這篇文章主要介紹了利用c語言實(shí)現(xiàn)卷積碼編碼器示例,需要的朋友可以參考下
    2014-03-03
  • C++讀寫(CSV,Yaml,二進(jìn)制)文件的方法詳解

    C++讀寫(CSV,Yaml,二進(jìn)制)文件的方法詳解

    為了處理文件,我們可以利用fstream庫。在這個(gè)庫里面有三種數(shù)據(jù)類型:ofstream,ifstream,fstream。本文將利用這個(gè)庫實(shí)現(xiàn)不同文件的讀寫操作,需要的可以參考一下
    2022-05-05
  • C++?std::copy與memcpy區(qū)別小結(jié)

    C++?std::copy與memcpy區(qū)別小結(jié)

    本文主要介紹了C++?std::copy與memcpy區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05

最新評(píng)論