C++實現歸併排序演算法
阿新 • • 發佈:2020-03-21
歸併
歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為二路歸併。
演算法描述
歸併操作的工作原理如下:
1、申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
2、設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
3、比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
4、重複步驟3直到某一指標超出序列尾
5、將另一序列剩下的所有元素直接複製到合併序列尾
圖示
C++程式碼
#include <iostream> using namespace std; //比較相鄰序列 void Merge(int arr[],int temp[],int start,int mid,int end){ int i = start,j = mid + 1,k = start; //將較小值放入申請序列 while(i != mid+1 && j != end+1){ if(arr[i] > arr[j]) temp[k++] = arr[j++]; else temp[k++] = arr[i++]; } //將多餘的數放到序列末尾 while(i != mid+1) temp[k++] = arr[i++]; while(j != end+1) temp[k++] = arr[j++]; //更新序列 for(i = start;i <= end;i++) arr[i] = temp[i]; } void MergeSort(int arr[],int end){ int mid; if(start < end){ //避免堆疊溢位 mid = start + (end - start) / 2; //遞迴呼叫 MergeSort(arr,temp,start,mid); MergeSort(arr,mid+1,end); Merge(arr,mid,end); } } int main(){ int a[8] = {50,10,20,30,70,40,80,60}; int i,b[8]; MergeSort(a,b,7); for(i=0; i<8; i++) cout<<a[i]<<" "; return 0; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。