C++實現(xiàn)歸并排序算法
歸并
歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。
算法描述
歸并操作的工作原理如下:
1、申請空間,使其大小為兩個已經(jīng)排序序列之和,該空間用來存放合并后的序列
2、設(shè)定兩個指針,最初位置分別為兩個已經(jīng)排序序列的起始位置
3、比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置
4、重復(fù)步驟3直到某一指針超出序列尾
5、將另一序列剩下的所有元素直接復(fù)制到合并序列尾
圖示

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++];
}
//將多余的數(shù)放到序列末尾
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 temp[],int start,int end){
int mid;
if(start < end){
//避免堆棧溢出
mid = start + (end - start) / 2;
//遞歸調(diào)用
MergeSort(arr,temp,start,mid);
MergeSort(arr,temp,mid+1,end);
Merge(arr,temp,start,mid,end);
}
}
int main(){
int a[8] = {50, 10, 20, 30, 70, 40, 80, 60};
int i, b[8];
MergeSort(a, b, 0, 7);
for(i=0; i<8; i++)
cout<<a[i]<<" ";
return 0;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++通過循環(huán)實現(xiàn)猜數(shù)字小游戲
這篇文章主要為大家詳細介紹了C++通過循環(huán)實現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-09-09
c++ 網(wǎng)絡(luò)庫asio的優(yōu)勢
這篇文章主要介紹了c++ 網(wǎng)絡(luò)庫asio的優(yōu)勢,幫助大家更好的利用c++開發(fā)服務(wù)端程序,感興趣的朋友可以了解下2020-10-10
C++實現(xiàn)LeetCode(45.跳躍游戲之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(45.跳躍游戲之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

