java-归并排序与快排的效率比较
来源:互联网 发布:浪潮软件官网 编辑:程序博客网 时间:2024/06/05 06:23
java-归并排序与快排的效率比较
用java完整地实现了归并排序和快速排序,然后测试两个算法在数组长度由100增加到一亿过程中的时间复杂度,比较两个算法效率。
归并排序
public class MergeSort { public int[] A; public MergeSort(int[] array) { this.A = array.clone(); sort(0, array.length - 1); } public void sort(int low, int high) { if (low < high) { int mid = (low + high) / 2; sort(low, mid); sort(mid + 1, high); merge(low, mid, high); } } public void merge(int low, int mid, int high) { // 声明新的数组,临时储存归并结果 int[] B = new int[high - low + 1]; int h = low; int i = 0; int j = mid + 1; while (h <= mid && j <= high) { if (A[h] <= A[j]) { B[i] = A[h]; h++; } else { B[i] = A[j]; j++; } i++; } // 等号很重要 if (h <= mid) { for (int k = h; k <= mid; k++) { B[i] = A[k]; i++; } } else { for (int k = j; k <= high; k++) { B[i] = A[k]; i++; } } for (int k = low; k < high; k++) { A[k] = B[k - low]; } }}
快速排序
public class QuickSort { public int[] A; public QuickSort(int[] array) { this.A = array.clone(); sort(0, array.length - 2); } public void sort(int p, int q) { if (p < q) { int j = partition(p, q); sort(p, j - 1); sort(j + 1, q); } } public int partition(int p, int q) { int j = q; int axis = A[p]; int i = p; while (true) { //从左往右找到第一个比axis大的数字 while (A[i] <= axis) { i++; }; //从右往左找到第一个小于等于axis的数字 while (A[j] > axis) { j--; }; if (i < j) { swap(i, j); } else { break; } } A[p] = A[j]; A[j] = axis; return j; } public void swap(int i, int j) { int tmp = A[i]; A[i] = A[j]; A[j] = tmp; }}
效率比较
新建TimeCounter类,用来实例化两个算法类,并测试两个算法。size指定测试数组的长度,maximum 指定生成的数组中元素的最大值,注意:由于快排的数组最后一个数字要求最大,因此实际的数组长度是是size+1
import java.util.Arrays;import java.util.Random;public class TimeCounter { public static void main(String[] args) { // TODO Auto-generated method stub int size = 101; int maximum = 100000; int[] array = new int[size]; for (int i = 0; i < array.length - 1; i++) { array[i] = new Random().nextInt(maximum); } //快排数组中的最后一个数字最大 array[size - 1] = maximum + 1; long QuickStart = System.currentTimeMillis(); new QuickSort(array); long QuickEnd = System.currentTimeMillis(); long MergeStart = System.currentTimeMillis(); MergeSort mergesort=new MergeSort(array); long MergeEnd = System.currentTimeMillis();// System.out.println(Arrays.toString(array));// System.out.println(Arrays.toString(mergesort.A)); System.out.println("quick sort: " + (QuickEnd - QuickStart)); System.out.println("merge sort: " + (MergeEnd - MergeStart)); }}
在同一台计算机上,修改size的值,运行TimeCounter.java,得到两个算法在不同数组长度下的执行时间:
结果
我们知道快排和归并的理论上的时间复杂性如下表:
1. 在数组长度小于一千万的时候,如下图,快速排序的速度要略微快于归并排序,可能是因为归并需要额外的数组开销(比如声明临时local数组用来储存排序结果),这些操作让归并算法在小规模数据的并不占优势。
2. 但是,当数据量达到亿级时,归并的速度开始超过快速排序了,如下图,因为归并排序比快排要稳定,所以在数据量大的时候,快排容易达到O(n^2)的时间复杂度,当然这里是指未改进的快排算法。
个人博客:https://pengzhaoqing.github.io/posts/
0 0
- java-归并排序与快排的效率比较
- 快排与堆排序、归并排序的比较
- 快排和归并排序的比较
- Java实现的排序算法及比较 [冒泡,选择,插入,归并,希尔,快排]
- 常见的三种排序算法(堆排、快排、归并排序)的比较总结
- 2个有用的排序,归并与快排
- 分治实现快排与归并排序
- 三种基于比较的nlgn排序算法 - 归并-堆-快排 - C++实现
- 几种排序方法的比较(选择、冒泡、归并、快排)
- 各种排序的实现:希尔 归并 堆排 快排
- 快排、堆排和归并排序的Python实现
- 直插,快排,堆排,归并排序的分析
- 快排和归并排序
- 快排求逆序数&快排与归并时间复杂度比较
- 冒泡、快排、直插三种排序的比较
- 常用排序算法简介与java实现(冒泡、插入、选择、希尔、归并、快排)
- 排序(快排,归并,堆排)
- 归并排序,堆排序,快排的简单实现
- JavaScript基本语法+类型转换
- 第七周oj5
- Python调试
- Hadoop 执行 hdfs namenode -format报错
- 把request对象中的请求参数封装到bean中/生成UUID
- java-归并排序与快排的效率比较
- ubuntu上简单操作(一)
- 19. Remove Nth Node From End of List
- linux使用手册
- WindowManager.LayoutParams详解
- 《数据结构导论之树、二叉树、森林间的转换》
- 记录一道JS笔试题
- 数学训练----数论F - Farey Sequence
- 使用Python从各个子文件夹中复制指定文件的程序