排序演算法__歸併排序
排序演算法__歸併排序
一、介紹
歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為二路歸併。注意歸併排序為穩定的排序。
二、C++實現
遞迴形式
#include<iostream>
using namespace std;
//對有序區間[l,mid)和[mid,r)進行合併
void merge(int a[],int l,int mid,int r)
{
int *temp=new int[r-l];//建立一個臨時陣列
int i=l,j=mid,k=0;//i和j分別是有序區間[l,mid)和[mid,r)的索引
while(i<mid&&j<r)
{
if(a[i]<=a[j])//讓temp[k]等於較小者
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<mid) temp[k++]=a[i++];//如果[l,mid)區間還沒掃描完
while(j<r) temp[k++]=a[j++];//如果[mid,r)區間還沒掃描完
for(i=0;i<k;i++)//將有序的區間[l,r)寫到原陣列
a[l+i]=temp[i];
}
//對區間[l,r)進行歸併排序
void mergeSort(int a[],int l,int r)
{
if(r-l==1) return;//區間[l,r)只有一個元素時遞迴結束
int mid=(l+r)>>1;
mergeSort(a,l,mid);//對區間[l,mid)進行排序
mergeSort(a,mid,r);//對區間[mid,r)進行排序
merge(a,l,mid,r);//對有序區間[l,mid)和[mid,r)進行合併
}
int main()
{
int a[10]={100,90,80,70,60,50,40,30,20,10};
printf("排序前:");
for(int i=0;i<10;i++)
printf("%d ",a[i]);
mergeSort(a,0,10);
printf("\n排序後:");
for(int i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
非遞迴形式
#include<iostream>
using namespace std;
//對有序區間[l,mid)和[mid,r)進行合併
void merge(int a[],int l,int mid,int r)
{
int *temp=new int[r-l];//建立一個臨時陣列
int i=l,j=mid,k=0;//i和j分別是有序區間[l,mid)和[mid,r)的索引
while(i<mid&&j<r)
{
if(a[i]<=a[j])//讓temp[k]等於較小者
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<mid) temp[k++]=a[i++];//如果[l,mid)區間還沒掃描完
while(j<r) temp[k++]=a[j++];//如果[mid,r)區間還沒掃描完
for(i=0;i<k;i++)//將有序的區間[l,r)寫到原陣列
a[l+i]=temp[i];
}
//對區間[l,r)進行歸併排序
void mergeSort(int a[],int n)
{
int len,i,j,mid;
for(len=1;len<=n;len*=2)//區間的長度為len
{
for(i=0;i+2*len<=n;i+=2*len)//對區間[i,i+2*len)進行排序
{
merge(a,i,i+len,i+2*len);//對區間[i,i+len)和[i+len,i+2*len)進行合併
}
//若 i+len<n,則剩餘一個子陣列沒有配對,將該子陣列合併到已排序的陣列中。
if(i+len<n) merge(a,i,i+len,n);
}
}
int main()
{
int a[10]={100,90,80,70,60,50,40,30,20,10};
printf("排序前:");
for(int i=0;i<10;i++)
printf("%d ",a[i]);
mergeSort(a,10);
printf("\n排序後:");
for(int i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
三、時間複雜度
相關文章
- 排序演算法:歸併排序排序演算法
- 歸併排序--排序演算法排序演算法
- 排序演算法 - 歸併排序排序演算法
- 排序演算法——歸併排序排序演算法
- 排序演算法之 '歸併排序'排序演算法
- [排序] 歸併排序排序
- 演算法:排序連結串列:歸併排序演算法排序
- 排序演算法總結之歸併排序排序演算法
- 快速排序&&歸併排序排序
- 演算法之歸併排序演算法排序
- 演算法之常見排序演算法-氣泡排序、歸併排序、快速排序演算法排序
- 排序演算法之「歸併排序(Merge Sort)」排序演算法
- 演算法(氣泡排序,快排,歸併排序)演算法排序
- 歸併排序排序
- 四、歸併排序 && 快速排序排序
- 演算法系列(四)排序演算法中篇--歸併排序和快速排序演算法排序
- 【分治演算法】歸併排序,快速排序和漢諾塔演算法排序
- 演算法學習 – 歸併排序演算法排序
- 演算法學習 - 歸併排序演算法排序
- 歸併排序--二路排序排序
- 歸併排序和基數排序排序
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 資料結構與演算法——排序演算法-歸併排序資料結構演算法排序
- java歸併排序Java排序
- [java]歸併排序Java排序
- 歸併排序模板排序
- 從演算法開始[歸併排序]演算法排序
- 排序(2)--選擇排序,歸併排序和基數排序排序
- php實現 歸併排序,快速排序PHP排序
- 複習資料結構:排序演算法(四)——歸併排序資料結構排序演算法
- O(lgn)的三種排序,快速排序、歸併排序、堆排序排序
- 氣泡排序、歸併排序與快速排序比較排序
- 歸併排序 js demo排序JS
- C# 歸併排序C#排序
- 【筆記】歸併排序筆記排序
- 歸併排序例項排序
- 歸併排序演算法(merge_Sort)排序演算法
- 排序演算法Python(冒泡、選擇、快速、插入、希爾、歸併排序)排序演算法Python