多路归并排序

来源:互联网 发布:阿里巴巴怎么传淘宝 编辑:程序博客网 时间:2024/06/05 02:53

在数据结构的课程中,我们都学习过归并排序,当时的归并排序都是采用二路归并的;但是在外部排序中,一般会采用多路归并;因为经典的二路归并IO的次数要比多路归并多很多,所以对算法的性能影响会很大;下面是笔者实现的一个多路归并排序算法。

import java.util.ArrayList;public class MultipleMerge {public static void main(String[] args) {int[] a = {1, 4, 7, 9, 10};int[] b = {-1, 5, 23, 89};int[] c = {-22, 2, 3, 90};int[] d = {-100, -80, 100, 345, 1000};ArrayList<Integer> result = new ArrayList<Integer>();multipleMerge(result, a, b, c, d);System.out.println(result);}public static void multipleMerge(ArrayList<Integer> result, int[] ... arrays){if(result == null)return;int[] num = new int[arrays.length];int[] idx = new int[arrays.length];for(int i = 0; i < arrays.length; i++){if(arrays[i] == null || arrays[i].length == 0)return;num[i] = arrays[i][0];idx[i] = 0;}int n = arrays.length;while(n > 0){int i = getMinIndex(num);result.add(num[i]);if(idx[i] == arrays[i].length-1){n--;num[i] = Integer.MAX_VALUE;}else{idx[i]++;num[i] = arrays[i][idx[i]];}}}private static int getMinIndex(int[] num){int min = Integer.MAX_VALUE;int index = -1;for(int i = 0; i < num.length; i++){if(num[i] < min){min = num[i];index = i;}}return index;}}
上述代码其实还可以进一步优化,在getMinIndex时,时间复杂度是O(N),但如果采用败者树,则时间复杂度可以提高到log(N)

0 0
原创粉丝点击