归并排序可以分为以下步骤:
1:将n个元素分成两个含n/2元素的子序列
2:用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列)
3:合并两个已排序好的序列
图解过程(盗的图)
代码如下:
c代码:
#include<stdio.h>
void merageSort(int A[],int p,int r);
void merage(int A[],int p,int q,int r);
int main(){
int n;
scanf("%d",&n);
int A[n];
for(int i=0;i<n;i++){
scanf("%d",&A[i]);
}
int p=0;
int r=n-1;
merageSort(A,p,r);
for(int i=0;i<n;i++){
printf("%d\t",A[i]);
}
return 0;
}
void merageSort(int A[],int p,int r){
int q=0;
if(p<r){
q=(p+r)/2;
merageSort(A,p,q);
merageSort(A,q+1,r);
merage(A,p,q,r);
}
}
void merage(int A[],int p,int q,int r){
int n1=q-p+1;
int n2=r-q;
int k=-1;
int a[n1];
int b[n2];
for(int m=0;m<n1;m++){
a[m]=A[m+p];
}
for(int n=0;n<n2;n++){
b[n]=A[n+q+1];
}
int i=0,j=0;
while(i<n1&&j<n2){
if(a[i]<=b[j]){
A[++k+p]=a[i];
i++;
}
else{
A[++k+p]=b[j];
j++;}
}
while(i<n1){
A[++k+p]=a[i];
i++;
}
while(j<n2){
A[++k+p]=b[j];
j++;
}
}
java代码:
import java.util.Scanner;
public class Fenzhi {
public static void merageSort(int A[],int p,int r){
int q=0;
if(p<r){
q=(p+r)/2;
merageSort(A,p,q);
merageSort(A,q+1,r);
merage(A,p,q,r);
}
}
public static void merage(int A[],int p,int q,int r){
int n1=q-p+1;
int n2=r-q;
int k=-1;
int []a=new int[n1];
int []b=new int[n2];
for(int m=0;m<n1;m++){
a[m]=A[m+p];
}
for(int n=0;n<n2;n++){
b[n]=A[n+q+1];
}
int i=0,j=0;
while(i<n1&&j<n2){
if(a[i]<=b[j]){
A[++k+p]=a[i];
i++;
}
else{
A[++k+p]=b[j];
j++;}
}
while(i<n1){
A[++k+p]=a[i];
i++;
}
while(j<n2){
A[++k+p]=b[j];
j++;
}
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int []A=new int[n];
for(int i=0;i<A.length;i++){
A[i]=input.nextInt();
}
int p=0;
int r=A.length-1;
merageSort(A,p,r);
for(int i=0;i<A.length;i++){
System.out.print(A[i]);
System.out.print(" ");
}
}
}