【算法】对比归并和快排的执行效率(1w~10w数据量的数组)

简介

测试从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实现

你可能感兴趣的:(算法和数据结构)