十大排序演算法之歸併排序5

2021-09-19 22:57:26 字數 1314 閱讀 7333

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2-路歸併。 

5.1 演算法描述

5.2 圖例演示

5.3 **實現

[cpp]

void merge(int arr, int l, int q, int r)

while(i<=mid&&j<=high)

while(i<=mid)//若比較完之後,第乙個有序區仍有剩餘,則直接複製到t陣列中

temp[k++]=arr[i++];

while(j<=high)//同上

temp[k++]=arr[j++];

for(i=low,k=0;i<=high;i++,k++)//將排好序的存回arr中low到high這區間

arr[i]=temp[k];

delete temp;//刪除指標,由於指向的是陣列,必須用delete }

//用遞迴應用二路歸併函式實現排序——分治法

void mergesort(int arr,int low,int high)

return result;

}

[cpp]

void merge(int arr,int low,int mid,int high)

while(i<=mid&&j<=high)

while(i<=mid)//若比較完之後,第乙個有序區仍有剩餘,則直接複製到t陣列中

temp[k++]=arr[i++];

while(j<=high)//同上

temp[k++]=arr[j++];

for(i=low,k=0;i<=high;i++,k++)//將排好序的存回arr中low到high這區間

arr[i]=temp[k];

delete temp;//刪除指標,由於指向的是陣列,必須用delete

}void mergesort2(int arr,int n)//n代表陣列中元素個數,即陣列最大下標是n-1

size*=2;//範圍擴大一倍

}}

5.4 演算法分析

歸併排序是一種穩定的排序方法。和選擇排序一樣,歸併排序的效能不受輸入資料的影響,但表現比選擇排序好的多,因為始終都是o(nlogn)的時間複雜度。代價是需要額外的記憶體空間。

十大排序演算法 歸併排序

歸併排序是一種概念上最簡單的排序演算法,歸併排序是基於分治法的。歸併排序將待排序的元素序列分成兩個長度相等的子串行,為每乙個子串行排序,然後再將他們合併成乙個子串行。合併兩個子串行的過程也就是兩路歸併。1,申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列 2,設定兩個指標,最初位...

十大排序演算法之歸併排序(MergeSort)

一 前言 資料結構與演算法,順便刷leetcode,無意間發現了乙個 我覺得講解的比較好的網頁,並且會拿leetcode裡面的題目當做例題,如有需要,奉上 五分鐘學演算法 二 演算法的介紹 分組,將序列的中的元素進行逐層折半分組,直到每組只有乙個元素。歸併,逐層向上排列每一層的元素的順序,然後合併成...

十大排序演算法之 歸併排序 五)

將兩個有序陣列進行歸併排序 將陣列分成兩部分分別排序 遞迴 private static void mergesort int arr,int left,int right 將陣列分成兩部分 int mid left right left 2 對陣列左邊進行排序 mergesort arr,left...