c语言实现
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void merge(int a[],int p,int q,int r);
void merge_sort(int a[],int p,int r);
int main()
{
int n,i;
printf("请输入n\n");
scanf("%d",&n);
int num[n];
printf("排序之前的数组:\n");
for(i=0;i<n;i++) {
num[i] = rand()%10+1;//产生从1-10的随机整数
printf("%d ",num[i]);
}
printf("\n");
merge_sort(num,0,n-1);
printf("排序之后的数组:\n");
for(i=0;i<n;i++) {
printf("%d ",num[i]);
}
return 0;
}
//归并排序
void merge_sort(int a[],int p,int r) {
int q;
if(p<r) {
q = (p+r+1)/2-1;
merge_sort(a,p,q);
merge_sort(a,q+1,r);
merge(a,p,q,r);
}
}
void merge(int a[],int p,int q,int r) {
int n1,n2,i,j,k;
//将数组分成两半
n1 = q-p+1;
n2 = r-q;
//定义两个新的数组
int m[n1+1],n[n2+1];
//将新定义的两个数组的最后一个元素值设置成无穷大
m[n1] = 9999;
n[n2] = 9999;
//进行两个新数组的赋值
for(i=0; i<n1; i++) {
m[i] = a[p+i];
}
for(j=0; j<n2; j++) {
n[j] = a[q+j+1];
}
//进行排序
i=0;
j=0;
for(k=p;k<=r;k++) {
if(m[i] <= n[j]) {
a[k] = m[i];
i++;
} else {
a[k] = n[j];
j++;
}
}
}
Java实现
package com.test;
import java.util.Random;
import java.util.Scanner;
public class MergeSort {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
long starttime = System.currentTimeMillis();
Scanner fin = new Scanner(System.in);
System.out.println("请输入n:");
int n = fin.nextInt();
int[] a = new int[n];
for(int i=0; i<n; i++) {
a[i] = new Random().nextInt(10)+1;
}
//排序前数组输出
System.out.println("排序前:");
for(int i=0; i<n; i++) {
System.out.print(a[i]);
System.out.print(" ");
}
System.out.println();
//调用排序函数
merge_sort(a,0,n-1);
//输出结果
System.out.println("排序后:");
for(int i=0; i<n; i++) {
System.out.print(a[i]);
System.out.print(" ");
}
long endtime = System.currentTimeMillis();
System.out.println("程序运行时间:"+(endtime-starttime)+"ms");
}
public static void merge_sort(int[] a,int p,int r) {
if(p < r) {
int q = (p+r+1)/2-1;
merge_sort(a,p,q);
merge_sort(a,q+1,r);
merge(a,p,q,r);
}
}
public static void merge(int[] a,int p,int q,int r) {
//p=0,q=个数/2-1,r=数组最后一个下标值
//一共r-p+1个
int n1 = q-p+1;
int n2 = r-q;
//新定义两个数组
int[] m = new int[n1+1];
int[] n = new int[n2+1];
//将新数组的最后一个元素赋值成无穷大,此处设为9999
m[n1] = 9999;
n[n2] = 9999;
//给新数组的其他元素赋初值
for(int i=0; i<n1; i++) {
m[i] = a[p+i];
}
for(int j=0; j<n2; j++) {
n[j] = a[q+1+j];
}
//进行排序
int i=0;
int j=0;
for(int k=p;k<=r;k++) {
if(m[i] <= n[j]) {
a[k] = m[i];
i++;
} else {
a[k] = n[j];
j++;
}
}
}
}