合并排序:
1):先是将序列按照二分划分为两个子序列;
2):将两个子序列递归排序;
3):将排好序的两个子序列进行合并;
(python版本)
#合并排序
def merge(arr,l,r,mid):
n1=mid+1-l
n2=r-mid
L=arr[l:mid+1]
R=arr[mid+1:r+1]
i=0
j=0
k=l
while i<n1 and j<n2:
if L[i]<R[j]:
arr[k]=L[i]
i+=1
else:
arr[k]=R[j]
j+=1
k+=1
while i<n1:
arr[k]=L[i]
i+=1
k+=1
while j<n2:
arr[k]=R[j]
j+=1
k+=1
def merge_sort(arr,l,r):
if l<r:
mid=(l+r)//2
merge_sort(arr,l,mid)
merge_sort(arr,mid+1,r)
merge(arr,l,r,mid)
if __name__=="__main__":
arr=[1,66,3,2,99,6,5,34]
n=len(arr)
merge_sort(arr,0,n-1)
print(arr)
(c++版本)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000010;
int q[N];
int t[N];
int n;
//第一步,将无序数组一分为二个数组
//第二步,将两个有序数组合并为一个有序数组
//也就是说,分为两个数组后,完成了排序
void gui_sort(int q[],int l,int r)
{
while(l>=r) return ;
int mid=l+r>>1;
gui_sort(q,l,mid), gui_sort(q,mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j]) t[k++]=q[i++];
else t[k++]=q[j++];
}
while(i<=mid) t[k++]=q[i++];
while(j<=r) t[k++]=q[j++];
for(int i=l,j=0; i<=r; i++,j++)
q[i]=t[j];
}
int main()
{
cin>>n;
for(int i=0; i<n; i++) cin>>q[i];
gui_sort(q,0,n-1);
for(int i=0; i<n; i++)
printf("%d ",q[i]);
return 0;
}