日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

经典排序算法(8)——归并排序算法详解

發(fā)布時(shí)間:2023/12/4 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典排序算法(8)——归并排序算法详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

歸并排序(Merge sort),是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為O(nlog n)。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用,且各層分治遞歸可以同時(shí)進(jìn)行。


一、算法基本思想

(1)基本思想

歸并排序的基本思想就是:把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的,然后再把有序子序列合并為整體有序序列。經(jīng)常被使用的是二路歸并算法,即將兩個(gè)已經(jīng)排序的序列合并成一個(gè)序列的操作。

(2)運(yùn)行過程

歸并排序算法的運(yùn)行過程如下:

1、申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序序列之和,該空間用來存放合并后的序列;

2、設(shè)定兩個(gè)指針,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置;

3、比較兩個(gè)指針?biāo)赶虻脑?#xff0c;選擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置;

4、重復(fù)步驟3直到某一指針達(dá)到序列尾;

5、將另一序列剩下的所有元素直接復(fù)制到合并序列尾。

(3)示例


二、算法實(shí)現(xiàn)(核心代碼)

C++實(shí)現(xiàn):

template<typename T> //整數(shù)或浮點(diǎn)數(shù)皆可使用 void merge_sort(T arr[], int len) {T* a = arr;T* b = new T[len];for (int seg = 1; seg < len; seg += seg) {for (int start = 0; start < len; start += seg + seg) {int low = start, mid = min(start + seg, len), high = min(start + seg + seg, len);int k = low;int start1 = low, end1 = mid;int start2 = mid, end2 = high;while (start1 < end1 && start2 < end2)b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];while (start1 < end1)b[k++] = a[start1++];while (start2 < end2)b[k++] = a[start2++];}T* temp = a;a = b;b = temp;}if (a != arr) {for (int i = 0; i < len; i++)b[i] = a[i];b = a;}delete[] b; }

Java實(shí)現(xiàn):

public void merge_sort(int[] arr) {int len = arr.length;int[] result = new int[len];int block, start;for(block = 1; block < len ; block *= 2) {for(start = 0; start <len; start += 2 * block) {int low = start;int mid = (start + block) < len ? (start + block) : len;int high = (start + 2 * block) < len ? (start + 2 * block) : len;//兩個(gè)塊的起始下標(biāo)及結(jié)束下標(biāo)int start1 = low, end1 = mid;int start2 = mid, end2 = high;//開始對(duì)兩個(gè)block進(jìn)行歸并排序while (start1 < end1 && start2 < end2) {result[low++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];}while(start1 < end1) {result[low++] = arr[start1++];}while(start2 < end2) {result[low++] = arr[start2++];}}int[] temp = arr;arr = result;result = temp;}result = arr; }

三、性能(算法時(shí)間、空間復(fù)雜度、穩(wěn)定性)分析

歸并排序的時(shí)間復(fù)雜度為O(nlogn)空間復(fù)雜度為O(n);是穩(wěn)定的排序算法

歸并排序速度僅次于快速排序,為穩(wěn)定排序算法。一般用于對(duì)總體無序,但是各子項(xiàng)相對(duì)有序的數(shù)列效果比較好。

總結(jié)

以上是生活随笔為你收集整理的经典排序算法(8)——归并排序算法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。