1. 程式人生 > 程式設計 >C++實現歸併排序演算法

C++實現歸併排序演算法

歸併

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

演算法描述

歸併操作的工作原理如下:

1、申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
2、設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
3、比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
4、重複步驟3直到某一指標超出序列尾
5、將另一序列剩下的所有元素直接複製到合併序列尾

圖示

C++實現歸併排序演算法

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;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。