国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實現的歸并排序算法詳解

2020-01-26 14:09:27
字體:
來源:轉載
供稿:網友

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

歸并排序

歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法。
該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;
即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。

歸并過程

1、比較a[i]和a[j]的大小,若a[i]≤a[j],則將第一個有序表中的元素a[i]復制到temp[k]中,并令i和k分別加上1;
2、否則將第二個有序表中的元素a[j]復制到temp[k]中,并令j和k分別加上1.
3、如此循環下去,直到其中一個有序表取完,然后再將另一個有序表中剩余的元素復制到r中從下標k到下標t的單元。

歸并排序的算法我們通常用遞歸實現,先把待排序區間[first, last]以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最后把左區間和右區間用一次歸并操作合并成有序的區間[first,last]。

歸并操作的工作原理

第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列
第二步:設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
第三步:比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置
重復步驟3直到某一指針超出序列尾,將另一序列剩下的所有元素直接復制到合并序列尾。

算法復雜度

時間復雜度為O(nlogn) 這是該算法中最好、最壞和平均的時間性能。
空間復雜度為 O(n)
比較操作的次數介于(nlogn) / 2和nlogn - n + 1。
賦值操作的次數是(2nlogn)。
歸并排序比較占用內存,但卻是一種效率高且穩定的算法。

算法C++代碼

//合并兩個序列void mergeArray(int arr[], int first, int mid, int last, int temp[]){  int i = first;  int j = mid + 1;  int m = mid ;  int n = last;  int k = 0;  while (i <= m && j<=n)  {    if (arr[i] <= arr[j])      temp[k++] = arr[i++];    else      temp[k++] = arr[j++];  }  while (i <= m)    temp[k++] = arr[i++];  while (j <= n)    temp[k++] = arr[j++];  for (i = 0; i < k; i++)    arr[first + i] = temp[i];}void mySort(int arr[], int first, int last, int temp[]){  if (first < last)  {    int mid = (first + last) / 2;    mySort(arr, first, mid, temp);    mySort(arr, mid+1, last, temp);    mergeArray(arr, first, mid, last, temp);  }}bool mergeSort(int arr[], int len){  int*p = new int[len];  if (NULL == p)    return false;  mySort(arr, 0, len - 1, p);  delete[] p;  return true;}

算法測試

#include <iostream>using namespace std;//上述歸并排序源碼int main(){  int arr[] = { 2, 23, 32, 34, 45, 6, 5, 65, 7, 6, 87, 87, 8, 798, 34, 35, 46, 45, 65, 756, 876, 8, 7, 87, 87, 5, 34, 344, 3, 32 };  int len = sizeof(arr) / sizeof(int);  mergeSort(arr, len);  for (int i = 0; i < len; i++)    cout << arr[i] << " ";  cout << endl;  system("pause");}

運行結果:

2 3 5 5 6 6 7 7 8 8 23 32 32 34 34 34 35 45 45 46 65 65 87 87 87 87 344 756 798 876請按任意鍵繼續. . .

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金平| 辛集市| 甘南县| 张掖市| 加查县| 光泽县| 客服| 兴国县| 子洲县| 河北省| 海安县| 芦山县| 安顺市| 柳江县| 雅江县| 台州市| 西乌珠穆沁旗| 石渠县| 探索| 中超| 兴和县| 巴马| 通许县| 甘谷县| 承德市| 平原县| 土默特右旗| 肇庆市| 温宿县| 桃园市| 神木县| 上杭县| 大石桥市| 绥化市| 林甸县| 东宁县| 宝丰县| 崇仁县| 南宁市| 凤冈县| 小金县|