c++歸并排序_合并排序法

8685090ac6f98e9fc53fa105a9273c3d.png

一、合并排序(Merge Sort) 就是將多個有序數據表合并成一個有序數據表。如果參與合并的只有兩個

有序表,那么稱為二路合并。對于一個原始的待排序序列,往往可以通過分割的方法來歸結為多路合

并排序。

二、一個待排序的原始數據序列進行合并排序的基本思路是,首先將含有n個結點的待排序數據序列看作有n個長度為1的有序子表組成,將他們依次兩兩合并,得到長度為2的若干有序子表;然后,再對這些子表進行兩兩合并,得到長度為4的若干有序子表; .......,重復上述過程,- -直重復到最后的子表

長度為n,從而完成排序過程。

三、例子

f6e2379368c14316ef16e0fd229b9c58.png
 ***********************************************************************/   // 歸并排序,分治法的典型代表: 將原問題分解了幾個子問題,解決子問題,再合并子問題的解,   // 這樣就得到了原問題的解。   // 分治本質上就是把原問題分解為幾個子問題來解決。   // 快速排序也是分治思想來解決。   //   //   // 歸并排序(merge-sort):   // 1. 把一個待排序的數組分解為兩個子數組;   // 2. 對兩個子數組進行排序(通過遞歸地調用自己來實現);   // 3. 對兩個已經排序的數組進行合并。   //   // 分析:   // 1. 一個數組一直分解下去,只到分解成只包含一個元素的子數組為止, 此時自然是有序的;   // 2. 歸并排序的重點在于合并,而不是對子數組的排序。(快速排序與它恰恰相反,快速排序的   // 重點是對子數組進行排序,而不是合并,因為它不需要合并了)   //   //   
#include <cstring>   
#include <iostream>   
typedef bool(*CompareFunc)(int, int);      // 下面函數實現合并功能,輸入三個下標參數表示了兩個子數組, :[nStart_, nMiddle)和[nMiddle, nEnd)   
void Merge(int array[], int nStart_, int nMiddle_, int nEnd_, CompareFunc comp)   {          
if (array == nullptr || nStart_ >= nMiddle_ || nMiddle_ >= nEnd_)           
return;              // 建立一個臨時數組存放中間數據       
int _nIndex = 0;        
int* _pTempArray = new int[nEnd_ - nStart_];              // 對兩個子數組進行合并       
int _nStartChange = nStart_;       
int _nMiddleChange = nMiddle_;       
while (_nStartChange < nMiddle_ && _nMiddleChange < nEnd_)       {           // 此處的if中比較語句的安排可以保持穩定排序的特性。           
if (comp(array[_nMiddleChange],  array[_nStartChange]))           
{               
_pTempArray[_nIndex] = array[_nMiddleChange];              ++_nMiddleChange;           }           
else           {               
_pTempArray[_nIndex] = array[_nStartChange];               
++_nStartChange;           }           
++_nIndex;       }              // 把不為空的子數組的元素追加到臨時數       
if (_nStartChange < nMiddle_)       {           
memcpy(_pTempArray + _nIndex, array + _nStartChange, sizeof(int) * (nMiddle_ - _nStartChange));       }       
else if (_nMiddleChange < nEnd_)       {           
memcpy(_pTempArray + _nIndex, array + _nMiddleChange, sizeof(int) * (nEnd_ - _nMiddleChange));       }       
else       {           /* do noting */       }          // 數據交換      memcpy(array + nStart_, _pTempArray, sizeof(int) * (nEnd_ - nStart_));          
delete [] _pTempArray;       _pTempArray = nullptr;   }      // 歸并排序功能實現函數   
void MergeSort(int array[], int nStart_, int nEnd_, CompareFunc comp)   {       // 數組指針為空,或者數組內的個數少于等于1個時,直接返回。       
if (nullptr == array ||  (nEnd_ - nStart_) <= 1)          return;          // 劃分為兩個子數組并遞歸調用自身進行排序       
int _nMiddle = (nStart_ + nEnd_) / 2;       
MergeSort(array, nStart_, _nMiddle, comp);       
MergeSort(array, _nMiddle, nEnd_, comp);          // 合并排序完成的子數組       
Merge(array, nStart_, _nMiddle, nEnd_, comp);   }      // 比較函數   
bool less(int lhs, int rhs)   {       
return lhs < rhs;   }      // 打印數組函數   
void PrintArray(int array[], int nLength_)   {      if (nullptr == array || nLength_ <= 0)           
return;         for (int i = 0; i < nLength_; ++i)       {           
std::cout << array[i] << " ";       }          
std::cout << std::endl;   }      /***************    main.c     *********************/ >>
int main(int argc, char* argv[])   {       // 測試1       
int array[10] = {1, -1, 1, 231321, -12321, -1, -1, 123, -213, -13};      PrintArray(array, 10);       
MergeSort(array, 0, 10, less);      PrintArray(array, 10);          // 測試2      
int array2[1] = {1};       PrintArray(array2, 1);      MergeSort(array2, 0, 1, less);       
PrintArray(array2, 1);          // 測試3       
int array3[2] = {1, -1};      PrintArray(array3, 2);       
MergeSort(array3, 0, 2, less);       
PrintArray(array3, 2);          
return 0;   } 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396957.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396957.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396957.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

golang json數組拼接

2016年06月16日 15:38:25 閱讀數&#xff1a;2575 標簽&#xff1a; golang json 數組 更多 個人分類&#xff1a; golang func main() {a : []byte({"Parents": [ "aaaaa", "bbbbbbb" ]})b : []byte({"Parents": [ "Gomez"…

php課程設計實驗心得,PHP程序設計教程實驗及課程設計

部分 教程1 基礎教程1.1 簡介1.2 WampServer安裝1.3 PHP語法1.4 變量1.5 echo和print語句1.6 數據類型1.7 字符串函數1.8 常量1.9 運算符1.10 條件語句1.11 Switch語句1.12 循環語句1.13 函數部分 教程1 基礎教程1.1 簡介1.2 WampServer安裝1.3 PHP語法1.4 變量1.5 echo和print…

DRUID連接池的簡單使用

DRUID——為監控而生的DB池 1. DRUID介紹 DRUID是阿里巴巴開源平臺上一個數據庫連接池實現&#xff0c;它結合了C3P0、DBCP、PROXOOL等DB池的優點&#xff0c;同時加入了日志監控&#xff0c;可以很好的監控DB池連接和SQL的執行情況&#xff0c;可以說是針對監控而生的DB連接池…

微習慣雖好,但是最重要的還是堅持

2019獨角獸企業重金招聘Python工程師標準>>> “微習慣”一詞是由美國的斯蒂芬蓋斯提出的。他以前是個宅男&#xff0c;懶蟲&#xff0c;為了改變自己而找到了這個方法。并且在自己身上實驗成功。養成了好的讀書、寫作和健身的習慣&#xff0c;實現了人生的華麗轉身。…

php手機端多圖預覽上傳,JS實現多圖預覽上傳的實例代碼

這篇文章主要介紹了JS實現多張圖片預覽同步上傳功能的相關資料,需要的朋友可以參考下廢話不多說了&#xff0c;直接給大家貼代碼了&#xff0c;具體代碼如下所示&#xff1a;/*** Created by liujing on 2017/5/10.*/$(document).ready(function($) {function changef(which,bu…

帶你了解zabbix整合ELK收集系統異常日志觸發告警~

今天來了解一下關于ELK的“L”-Logstash,沒錯&#xff0c;就是這個神奇小組件&#xff0c;我們都知道&#xff0c;它是ELK不可缺少的組件&#xff0c;完成了輸入&#xff08;input&#xff09;&#xff0c;過濾&#xff08;fileter&#xff09;&#xff0c;output&#xff08;輸…

用python設計學生管理系統_Python實現GUI學生信息管理系統

本文實例為大家分享了Python實現GUI學生信息管理系統的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下 項目環境&#xff1a; 軟件環境: OS:RedHat6.3 Lib:Pygtk Language:Python Support tool:Glade3 項目簡述&#xff1a; ①Glade3設計用戶的登錄窗口&#xff0c;功…

http響應頭設置

protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 設置響應頭數據response.setHeader(null, "HTTP/1.1 200 OK");response.setHeader("Server", "Apache-Coyote/1.1"…

java用數組實現單詞計數,MapReduce實現單詞計數原理及Java編程:WordCount

MapReduce實現單詞計數&#xff1a;WordCount單詞計數的文本信息(hello.txt)&#xff1a;hello can i help youi have a dreammaybe you can help me? 實現過程&#xff1a;? Map過程&#xff1a;并行讀取文本&#xff0c;對讀取的單詞進行Map操作&#xff0c;每個詞將會形成…

python理論知識選擇題_Python基礎自測題答案和基礎知識梳理

Python基礎自測題答案和基礎知識梳理 1.關于Python中的lambda表達式的函數體自能是單獨一條語句&#xff0c;所以答案選擇C。 例如&#xff1a;>>>g lambda x: 2*x1 g(3) 7 2.Python中的變量不需要事先聲明&#xff0c;但是需要創建和賦值&#xff0c;否則你怎么用&a…

STM32f4 ARM Bootloader

參考資料&#xff1a; 基于ARM 的嵌入式系統Bootloader 啟動流程分析 Bootloader 詳解 ( 代碼環境 | ARM 啟動流程 | uboot 工作流程 | 架構設計) Android系統啟動流程 -- bootloader 在main()之前&#xff0c;IAR都做了啥&#xff1f; STM32 IAP程序 源碼 和測試代碼 有詳細的…

查找算法之順序查找

參考&#xff1a; 1. 順序查找 | 博客園 基本思想&#xff1a; 順序查找&#xff0c;就是從第一個元素開始&#xff0c;按索引順序遍歷待查找序列&#xff0c;直到找出給定目標或者查找失敗。 特點&#xff1a; 1. 對待查序列&#xff08;表&#xff09;無要求 -- 待查找序列可…

matlab kfda,SVD與KFDA相結合人臉識別-matlab-畢業論文

XXXXxx畢業設計(論文)最高達到88%。當在抽取的特征維數為39&#xff0c;PCA空間的投影維數為110的情況下&#xff0c;隨著訓練樣本個數的增加&#xff0c;LDA的識別情況如表4所示表4 ORL人臉庫LDA測試結果(2)訓練樣本數 識別率/% 識別時間/S3 68.2 52.3594 87.92 31.5315 88.00…

python數據預測_python時間序列預測股票走勢

提示&#xff1a;這只是個訓練模型&#xff0c;技術不具備實際意義&#xff0c;入市需謹慎。 首先調用tushare包 import tushare as ts import pandas as pd import matplotlib.pyplot as plt 查自己比較感興趣的股票&#xff0c;這里我查找的是新能源/燃料電池/氫燃料&#xf…

30.Android之百度地圖簡單學習

今天用了下百度地圖&#xff0c;簡單寫了一個例子&#xff0c;記錄下。 一、申請AK&#xff08;API Key&#xff09; 要想使用百度地圖sdk&#xff0c;就必須申請一個百度地圖的api key。申請流程挺簡單的。 首先注冊成為百度的開發者&#xff0c;然后打開http://lbsyun.baidu.…

在datatable中,在指定位置插入列

假如dataset ds 里面已經存在了數據&#xff0c;當我們想在datatable中插入一列數據&#xff0c;可以用以下方法實現&#xff1a;ds.Tables[0].Columns.Add("star");ds.Tables[0].Columns["star"].SetOrdinal(0);這樣“star”列就添加到datatable的第一列了…

python爬取b站彈幕_爬取B站彈幕并且制作詞云

目錄 SRE實戰 互聯網時代守護先鋒&#xff0c;助力企業售后服務體系運籌帷幄&#xff01;一鍵直達領取阿里云限量特價優惠。 爬取彈幕 1. 從手機端口進入網頁爬取找到接口 2.代碼 import requests from lxml import etree import numpy as np urlhttps://api.bilibili.com/x/v1…

myeclipse始終build workspace

之前我的myeclipse運行某個項目的時候&#xff0c;總是不停的buildworkspace&#xff0c;而且稍微改動一個(不管是java類還是jsp)都會加載接近1分鐘甚至更久&#xff0c;從網上搜了好久&#xff0c;先總結下搜的多數方法 1、叫你去掉.project文件的一段話 <buildCommand>…

python控制燈_Python 控制樹莓派 GPIO 輸出:控制 LED 燈

樹莓派 GPIO 控制輸出的入門應該都是從控制 LED 燈開始的吧。 樹莓派版本&#xff1a;Model 3B 樹莓派系統&#xff1a;Raspbian Stretch with desktop and recommended software&#xff0c;April 2019 連接裝置 準備一個 LED 燈&#xff0c;兩個兩頭都為母的杜邦線。對照下圖…