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

C++實現(xiàn)自頂向下的歸并排序算法

 更新時間:2015年12月11日 11:04:19   作者:NW_KNIFE  
這篇文章主要介紹了C++實現(xiàn)自頂向下的歸并排序算法,結合實例詳細分析了自頂向下的歸并排序算法的原理與具體實現(xiàn)步驟,具有一定參考借鑒價值,需要的朋友可以參考下

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

一. 算法描述

自頂向下的歸并排序:采用分治法進行自頂向下的程序設計方式,分治法的核心思想就是分解、求解、合并。

1. 先將長度為N的無序序列分割平均分割為兩段
2. 然后分別對前半段進行歸并排序、后半段進行歸并排序
3. 最后再將排序好的前半段和后半段歸并

過程(2)中進行遞歸求解,最終下圖詳細的分解了自頂向下的合并算法的實現(xiàn)過程:

二. 算法實現(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){
  if(intArr_len > 1){
    int* intArr1 = intArr;
    int intArr1_len = intArr_len/2;
    int* intArr2 = intArr + intArr_len/2;
    int intArr2_len = intArr_len - intArr1_len;
    //分別歸并排序
    merge_sort(intArr1,intArr1_len);
    merge_sort(intArr2,intArr2_len);
    //排序
    merge_array(intArr1, intArr1_len, intArr2, intArr2_len);
  }
}
//合并兩個數(shù)組,并排序
void merge_array(int* intArr1, int len1, int* intArr2, int len2){
  //申請分配空間
  int* list = (int*) malloc((len1+len2) * sizeof (int));
  int i = 0, j = 0, k = 0;
  while(i < len1 && j < len2){
     // 把較小的那個數(shù)據(jù)放到結果數(shù)組里, 同時移動指針
    list[k++] = (intArr1[i] < intArr2[j]) ? intArr1[i++] : intArr2[j++];
  }
  // 如果 intArr1 還有元素,把剩下的數(shù)據(jù)直接放到結果數(shù)組
  while(i < len1){
    list[k++] = intArr1[i++];
  }
  // 如果 intArr2 還有元素,把剩下的數(shù)據(jù)直接放到結果數(shù)組
  while(j < len2){
    list[k++] = intArr2[j++];
  }
   // 把結果數(shù)組 copy 到 intArr1 里
  for(i = 0; i < k; i++){
    intArr1[i] = list[i];
  }
  //釋放申請的空間
  free(list);
}

三. 算法分析

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

希望本文所述對大家C++程序設計有所幫助。

相關文章

  • C++空類默認函數(shù)詳細解析

    C++空類默認函數(shù)詳細解析

    如果你只是聲明一個空類,不做任何事情的話,編譯器會自動為你生成一個默認構造函數(shù)、一個拷貝默認構造函數(shù)、一個默認拷貝賦值操作符和一個默認析構函數(shù)
    2013-10-10
  • opencv3/C++實現(xiàn)光流點追蹤

    opencv3/C++實現(xiàn)光流點追蹤

    今天小編就為大家分享一篇opencv3/C++實現(xiàn)光流點追蹤,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • c語言描述回文數(shù)的三種算法

    c語言描述回文數(shù)的三種算法

    這篇文章主要介紹了c語言描述回文數(shù)的三種算法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 淺談C++中replace()方法

    淺談C++中replace()方法

    C++編程語言中的string應用方式多樣化,每一種應用方式都能幫助我們提實現(xiàn)特定的功能需求。在這里我們將會為大家詳細介紹一下其中一個比較重要的用法,有關C++ replace()函數(shù)的應用方式,需要的朋友可以參考下
    2015-11-11
  • C++?Qt實現(xiàn)動態(tài)增加垂直滾動條

    C++?Qt實現(xiàn)動態(tài)增加垂直滾動條

    本博文源于筆者正在工作的一個小內容,內容涉及到為qt動態(tài)增加垂直滾動條,文章分為三個部分,問題起源,問題解決方案,問題解決成功效果,思路清晰,文章干貨滿滿,復制源碼即可使用,需要的朋友可以參考下
    2023-08-08
  • C/C++通過IP獲取局域網網卡MAC地址

    C/C++通過IP獲取局域網網卡MAC地址

    這篇文章主要為大家詳細介紹了C++如何通過Win32API函數(shù)SendARP從IP地址獲取局域網內網卡的MAC地址,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-02-02
  • C語言 鏈式二叉樹結構詳解原理

    C語言 鏈式二叉樹結構詳解原理

    二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系。通常的方法是鏈表中每個結點由三個域組成,數(shù)據(jù)域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址
    2021-11-11
  • C語言線程池的常見實現(xiàn)方式詳解

    C語言線程池的常見實現(xiàn)方式詳解

    本文介紹了如何使用 C 語言實現(xiàn)一個基本的線程池,線程池的實現(xiàn)包括工作線程、任務隊列、任務調度、線程池的初始化、任務添加、銷毀等步驟,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • C++實用庫之字節(jié)流合成器

    C++實用庫之字節(jié)流合成器

    在處理跨平臺的數(shù)據(jù)交換或網絡通信時,字節(jié)流的重要性更加突出,不同的系統(tǒng)可能有不同的字節(jié)序(大端序或小端序),因此在發(fā)送和接收字節(jié)流時,可能需要考慮字節(jié)序的轉換,這篇文章主要介紹了C++實用庫之字節(jié)流合成器,需要的朋友可以參考下
    2024-04-04
  • C語言 90后懷舊游戲超級瑪麗的實現(xiàn)流程

    C語言 90后懷舊游戲超級瑪麗的實現(xiàn)流程

    90后最風靡的游戲是什么?第一個聯(lián)想到的肯定是插卡游戲機或者VCD加光盤運行在電視機上的超級瑪麗了,它的經典絕對可以排在第一位,長大后的我們今天來用C語言重溫一下
    2021-11-11

最新評論