版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/diyinqian/article/details/83304109
简介
测试从1w~10w数据量下,归并和快排各自的执行效率以及平均执行效率。
结论
快排不稳定,但是平均下来比归并快。
代码
package main.java.test;
import java.util.Arrays;
/**
* @author 12556
*
*/
public class MergeSort {
/**
* 生成指定大小的随机数数组
* @param numberCount
* @return
*/
private static int[] getRandomArr(int numberCount) {
int a[] = new int[numberCount];
for (int i = 0; i < a.length; i++) {
a[i] = (int) (1+(int)(Math.random()*(numberCount*5-1)));
}
return a;
}
/**
* 归并排序
* @param a
* @param i
* @param j
*/
private static void mergeSort(int[] a, int i, int j) {
if (i < j) {
int mid = (i+j)/2;//这里取中位数,不能是(j-i+1)/2
mergeSort(a, i, mid);
mergeSort(a, mid+1, j);
merge(a,i,mid,j);
}
}
/**
* 归并排序的合并操作(核心操作)
* 注意这个函数必须有left参数,不可以每次都是从0开始
* @param a
* @param left
* @param mid
* @param right
*/
private static void merge(int[] a,int left, int mid, int right) {
int i = left;
int j = mid+1;
int k = 0;
int ans[] = new int[right-left+1];
while (i <= mid && j <= right) {
if (a[i] <= a[j]) {
ans[k++] = a[i++];
}else{
ans[k++] = a[j++];
}
}
while(i <= mid) {
ans[k++] = a[i++];
}
while(j <= right) {
ans[k++] = a[j++];
}
for(int t = left,tans=0;t <= right;t++) {
a[t] = ans[tans++];
}
}
/**
* 快速排序
* @param a
* @param i
* @param j
*/
private static void quickSort(int[] a, int i, int j) {if (i < j) {
int mid = partition(a,i,j);
quickSort(a, i, mid-1);
quickSort(a, mid+1, j);
}
}
/**
* 快排构造分割点,使得分割点左边元素都小于分割点,右边元素都大于分割点。
* @param a 待排序数组
* @param low 本次寻找分割点的区间中的最小坐标
* @param high 本次寻找分割点的区间中的最大坐标
* @return 分割点的坐标
*/
private static int partition(int[] a, int low, int high) {
int biao = a[low];
while(low < high) {
while (low < high && a[high] >= biao)
high--;
if (low < high)
a[low++] = a[high];
while (low < high && a[low] <= biao)
low++;
if (low < high)
a[high--] = a[low];
}
a[low] = biao;
return low;
}
public static void main(String[] args) {
int wan = 10000;
double mergeSum = 0;
double mergeAve = 0;
double quickSum = 0;
double quickAve = 0;
for(int i = 1;i <= 10;i++) {
int n = i*wan;
int a[] = getRandomArr(n);//数组个数
int b[] = a.clone();
// System.out.println("归并排序 defore:");
// System.out.println(Arrays.toString(a));
long startTime = System.nanoTime();
mergeSort(a,0,n-1);
double duration = (System.nanoTime()-startTime)/(1000000*1.0);
// System.out.println("after:");
// System.out.println(Arrays.toString(a));
mergeSum += duration;
System.out.println(i+"0000"+"条数据在归并排序上的duration(ms)="+duration);
// System.out.println("快速排序 defore:");
// System.out.println(Arrays.toString(b));
long startTime2 = System.nanoTime();
quickSort(b,0,n-1);
double duration2 = (System.nanoTime()-startTime2)/(1000000*1.0);
// System.out.println("after:");
// System.out.println(Arrays.toString(a));
quickSum += duration2;
System.out.println(i+"0000"+"条数据在快速排序上的duration(ms)="+duration2);
}
mergeAve = mergeSum/10;
quickAve = quickSum/10;
System.out.println("归并排序和快排的平均时间(ms)分别是:"+mergeAve+" "+quickAve);
}
}
详细介绍算法:
快排和归并的详细介绍请看:
【算法】快速排序算法的java实现
【算法】归并排序算法的java实现