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

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

詳解C++實現(xiàn)的歸并排序算法

2020-02-24 14:25:28
字體:
供稿:網(wǎng)友

說到歸并排序,其實這在信息奧運會中是經(jīng)常使用的方法,現(xiàn)在這個也是很多人都喜歡的,想要學(xué)習(xí)的朋友,就隨武林技術(shù)頻道小編來詳解C++實現(xiàn)的歸并排序算法吧!

歸并排序

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

歸并過程

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

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

歸并操作的工作原理

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

算法復(fù)雜度

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

算法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");}

運行結(jié)果:

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請按任意鍵繼續(xù). . .看了上面的介紹,相信大家對詳解C++實現(xiàn)的歸并排序算法,已經(jīng)有了自己的認識,武林技術(shù)頻道將為大家提供更多的專業(yè)知識。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 庆阳市| 保康县| 阿瓦提县| 平顶山市| 灵璧县| 普兰店市| 营口市| 湄潭县| 射阳县| 平果县| 延川县| 满城县| 多伦县| 石首市| 方城县| 临泉县| 漾濞| 荆门市| 平昌县| 西丰县| 隆子县| 叙永县| 且末县| 武威市| 嘉善县| 巴南区| 黄龙县| 榆林市| 铜川市| 嘉义市| 白水县| 桂东县| 嘉荫县| 东丰县| 滦南县| 安福县| 安宁市| 根河市| 寿光市| 新津县| 石门县|