八大排序演算法之五——歸併排序
1、基本思想。
歸併排序是將兩個(或兩個以上)的有序表合併成一個新的有序表。
2、實現。
/** * @brief mergeSortedArray 將兩個已經排好序的區間 * [first,mid] 、[mid+1,last] 合併成一個排好序的區間 * @param array 總區間的起始地址 * @param first 第一個有序區間的起點 * @param mid 第一個有序區間的終點 * @param last 第二個區間的終點 */ void mergeSortedArray(int* array,int first,int mid,int last) { int* tempArray=(int*)malloc((last-first+1)*sizeof(int)); int indexPre=first; int indexRear=mid+1; int tempArrayIndex=0; for(;indexPre<=mid&&indexRear<=last;tempArrayIndex++) { if(array[indexPre]<=array[indexRear]) { tempArray[tempArrayIndex]=array[indexPre++]; } else { tempArray[tempArrayIndex]=array[indexRear++]; } } if(indexPre<=mid) { for(int i=indexPre;i<=mid;++i) { tempArray[tempArrayIndex++]=array[i]; } } if(indexRear<=last) { for(int i=indexRear;i<=last;++i) { tempArray[tempArrayIndex++]=array[i]; } } for(int i=0;i<last-first+1;++i) { array[i+first]=tempArray[i]; } free(tempArray); } void mergeSort(int* array,int first,int last) { int mid=0; if(first<last) { mid=(first+last)/2; mergeSort(array,first,mid); mergeSort(array,mid+1,last); mergeSortedArray(array,first,mid,last); } return; } int main() { int a[10]={11,42,53,25,36,6,75,8,26,4}; std::cout<<"before sort:"<<std::endl; for(int i=0;i<10;++i) std::cout<<a[i]<<"\t"; std::cout<<std::endl; mergeSort(a,0,9); std::cout<<"after sort:"<<std::endl; for(int i=0;i<10;++i) std::cout<<a[i]<<"\t"; std::cout<<std::endl; return 0; }
3、執行結果。
相關推薦
八大排序演算法之五——歸併排序
1、基本思想。歸併排序是將兩個(或兩個以上)的有序表合併成一個新的有序表。2、實現。/** * @brief mergeSortedArray 將兩個已經排好序的區間 * [first,mid] 、[mid+1,last] 合併成一個排好序的區間 * @param a
排序演算法之二:歸併排序
演算法分析:是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。 將已有序的子序
Java八大排序演算法之"希爾排序(最小增量排序)"演算法
希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因DL.Shell於1959年提出而得名。 ———————-本段來自百度百科 是插入排序的一種,只不
八大排序演算法詳解——歸併排序
基本思想 n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果: 初始狀態:無序區為R[1..n],有序區為空。 第1趟排序: 在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1] 交換,使R[1..1
白話經典算法系列之五 歸併排序的實現(講的真好)
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。 首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第一個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再
白話經典算法系列之五 歸併排序的實現
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列
【S-排序】python實現八大排序演算法之9-桶排序(BucketSort)
桶排序 基本思想: 基本思想很簡單,如果有一個數組A,包含N個整數,值從1到M,桶排序(BucketSort)。留置一個數組S,裡面含有M個桶,初始化為0。然後遍歷陣列A,讀入Ai時,S[Ai]增一
JavaScript 資料結構與演算法之美 - 歸併排序、快速排序、希爾排序、堆排序
1. 前言 演算法為王。 想學好前端,先練好內功,只有內功深厚者,前端之路才會走得更遠。 筆者寫的 JavaScript 資料結構與演算法之美 系列用的語言是 JavaScript ,旨在入門資料結構與演算法和方便以後複習。 之所以把歸併排序、快速排序、希爾排序、堆排序放在一起比較,是因為它們的平均時
【Java】 大話資料結構(17) 排序演算法(4) (歸併排序) 資料結構與演算法合集 資料結構與演算法合集
本文根據《大話資料結構》一書,實現了Java版的堆排序。 更多:資料結構與演算法合集 基本概念 歸併排序:將n個記錄的序列看出n個有序的子序列,每個子序列長度為1,然後不斷兩兩排序歸併,直到得到長度為n的有序序列為止。 歸併方法:每次在兩個子序列中找到較小的那一個賦值給合併序列(通過指標進行操
排序演算法之希爾排序【java實現】
前面介紹的冒泡、選擇、插入排序演算法雖然簡單直觀,但是在排序上的效率一般。對於大量的資料排序就需要更加高效的演算法,那麼下面來介紹一下高效的排序演算法----希爾排序,又稱Shell排序,縮小增量排序。 實際上,希爾排序是基於插入排序的思想。 實現步驟: (1)將有n個元素的陣列分成n/
插入排序演算法之折半插入排序演算法
之前有學過二分查詢,其實折半插入跟二分查詢都是同一個原理。在百度百科開了折半排序演算法的原理後,自己試著根據原理寫出了版本一的演算法,版本二是參照巨人的實現思想,版本二才是重點。版本一可以忽略不看。 演算法同樣的目的是尋找正確的插入點。 版本一: 實現思想: 第一步:獲取折半後的下標
【排序演算法5】歸併排序
歸併排序是分治法的一種典型應用。 歸併排序的原理是合併兩個有序序列是簡單的。 先對元素進行分割,分割到最後只有單一元素的時候進行歸併。兩兩一組自底向上歸併。 #include <stdio.h> #include <Windows.h> #include "M
排序演算法 之 簡單插入排序
簡單插入排序演算法原理:從整個待排序列中選出一個元素插入到已經有序的子序列中去,得到一個有序的、元素加一的子序列,直到整個序列的待插入元素為0,則整個序列全部有序。 在實際的演算法中,我們經常
排序演算法6——圖解歸併排序及其遞迴與非遞迴實現
排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標) 排序演算法2——圖解簡單選擇排序及其實現 排序演算法3——圖解直接插入排序以及折半(二分)插入排序及其實現 排序演算法4——圖解希爾排序及其實現 排序演算法5——圖解堆排序及其實現 排序演算法6——圖解歸併排序及其遞迴與非
排序演算法之希爾排序
演算法分析: 希爾排序(Shell Sort)是插入排序的一種,其實質就是分組插入排序,該方法又稱縮小增量排序,因D.L.Shell於1959年提出而得名。它是對直接插入排序的一種改進,通過加大插入排序中元素之間的間隔,並在這些有間隔的元素中進行插入排序,從而使得資料項大跨
排序演算法之希爾排序 java實現
知識準備 基礎概念 希爾排序:在直接插入排序的基礎上進行的優化,直接插入排序在n值小的時候效率比較高,在n很大的時候如果待排序序列基本有序,效率依然很高,時間效率可以提升為O(n)。希爾排序也稱之為縮小增量排序。 1.先選取一個小於n的整數d(步長
排序演算法之直接插入排序和希爾排序
相信許多人和我一樣,排序演算法看了好幾遍,當時看懂了,過幾天一些細節又忘記,所以現在講排序演算法做一個總結,從最基本的排序演算法展開來,首先分析直接插入排序和希爾排序。 1.直接插入排序 思想:把一個數插入到已經排序的有序序列中; 方法:將這個數與有序序列
排序演算法之希爾排序法(c#實現)
希爾排序演算法是將陣列的所有元素按照一定增量d分組,對每組內的資料實行插入排序,之後不斷減小增量,每組內所包含的元素也越多,增量減少至1時,整個陣列被分成一組,插入排序結束後整個陣列的排序便完成。演算法流程圖:操作步驟:初始時,有一個大小為 10 的無序序列。(1)在第一趟排
排序演算法Java實現——歸併排序
歸併排序(也可以叫合併排序),其實歸併排序的本質就是合併排序。 它是與插入排序、交換排序、選擇排序不同的一類排序方法,不同之處在於: 它要求:待排序序列是由若干個有序子序列組成。 那麼究竟什麼是歸併排序呢?歸併這個詞到底是什麼意思? 首先可以理解為就是合併,然後就是這個詞的
圖解排序演算法及實現——歸併排序 (Merge Sort)
思路 歸併排序(MergeSort),是建立在歸併操作上的一種有效的排序演算法,效率為O(nlogn) 。1945年由約翰·馮·諾伊曼首次提出。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用,且各層分治遞迴可以同時進行。 實