归并排序的Java实现、性能分析以及适用场景
来源:互联网 发布:pace.js 在线演示 编辑:程序博客网 时间:2024/06/07 20:14
1.归并排序的Java实现:
代码如下:
package com.zm.testSort;/** * 归并排序 * @author zm */public class MergeSort { public static void getMergeSort(int[] a) { if(a == null || a.length < 2) { return; } getMergeSort(a, 0, a.length-1); } public static void getMergeSort(int[] a, int low, int high) { if(high > low) { int mid = (high + low)/2;//获取中间值 getMergeSort(a, low, mid);//分治 getMergeSort(a, mid+1, high);//分治 merge(a, low, mid, high);//合并两个子序列 } } /** * 思想:将辅助数组分为两部分,如[a, b] [c, d],每个子序列是有序的,即a<b,c<d,因此,每回都是将 * 第二部分的最小值c与第一部分的最小值a比较,如果c<a,则说明c是最小的,将c赋给原数组的第一个位置且用d与a比较,如果 * c>a,则说明a是最小的,将a赋给原数组的第一个位置且再比较b与c。 */ public static void merge(int[] a, int low, int mid, int high) {//合并两个子序列 int[] aux = new int[a.length];//创建辅助数组 for(int k = low; k <= high; k++) {//将a数组赋值给辅助数组 aux[k] = a[k]; } int i = low;//用于操作辅助数组 int j = mid + 1;//用于操作辅助数组 int k = low;//用于保存正确排序的a数组的值 for(;i <= mid && j <= high;k++) { if(aux[j] >= aux[i]) {//辅助数组的第二部分的第一个值开始,与第一部分的第一个值比较 a[k] = aux[i++];//如果大于,将索引i的元素赋给a数组的索引k位置,同时索引i往后移 }else { a[k] = aux[j++];//如果小于,将索引j的元素赋给a数组的索引k位置,同时索引j往后移 } } while(i <= mid) {//如果此时i还在[0, mid]范围之内,说明剩下的i~mid之间的元素是最大的,将这些元素全部插入到a数组的最后 a[k++] = aux[i++]; } while(j <= high) {//如果此时j还在[mid+1, high]范围之内,说明剩下的j~high之间的元素是最大的,将这些元素全部插入到a数组的最后 a[k++] = aux[j++]; } } public static void main(String[] args) { int[] a = {3, 5, 1, 2, 6, 4, 7, 11, 23, 44, 3, 34, 8, 23, 6, 9}; getMergeSort(a); System.out.print("归并排序:"); for(int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); }}}
2.归并排序的性能分析:
时间复杂度:
1. 最好情况:O(nlog2(n))
2. 平均情况:O(nlog2(n))
3. 最坏情况:O(nlog2(n))
空间复杂度:O(n)
稳定性:稳定(相同元素的相对位置不会改变)
3.适用场景
3.1:)若n较大,则应采用时间复杂度为O(nlog2(n))的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。
若要求排序稳定,则可选用归并排序。但前面介绍的从单个记录起进行两两归并的排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子序列,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。
3.2:归并排序和快速排序一样,都采用了分治的思想。
阅读全文
0 0
- 归并排序的Java实现、性能分析以及适用场景
- 冒泡排序的Java实现、性能分析以及适用场景
- 希尔排序的Java实现、性能分析以及适用场景
- 快速排序的Java实现、性能分析以及适用场景
- 堆排序的Java实现、性能分析以及适用场景
- 直接插入排序的Java实现、性能分析以及适用场景
- 简单选择排序的Java实现、性能分析以及适用场景
- 归并排序的JAVA实现和性能分析
- 对字符串进行直接插入排序、堆排序、归并排序、快速排序实现以及性能分析
- 排序算法的C++实现与性能分析(插入排序、归并排序、快速排序、STOOGE排序、堆排序)
- 各种排序算法的场景以及c++实现(插入排序,希尔排序,冒泡排序,快速排序,选择排序,归并排序)
- 归并排序详解——思路分析以及核心代码(java)实现...非递归实现
- java实现的归并排序
- 归并排序的java实现
- 归并排序的Java实现
- 归并排序的java实现
- 归并排序的java实现
- 归并排序的java实现
- java毕向东学习笔记——day09
- HDU 6124 Euler theorem
- 非线性-Logistic(逻辑斯特)回归
- 初学者入门web前端 C#基础知识:数组与集合
- 图片上传
- 归并排序的Java实现、性能分析以及适用场景
- linux发送邮件相关
- Java并发编程:Callable、Future和FutureTask
- 用cmd查看已连接过的所有wifi名和密码
- shell 1>&2 2>&1 &>filename重定向的含义和区别
- 16.ranlib
- akka学习教程(八) Actor中的Future-询问模式
- python---基本socket编写
- 过山车||HDU2063