`
woxiaoe
  • 浏览: 283316 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

归并排序 续

阅读更多

昨天那篇犯了了一个错误,把已经排序好的数据给Arrays.sort 排序,以致结果相差悬殊。今天发了一个修改过的代码,不过仍慢于JDK实现的。

package com.woxiaoe.algorithm;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

/**
 * 合并排序
 * @author 小e
 *
 * 2010-4-4 下午11:25:57
 */
public class MergeSort {
	public static int LIST_SIZE = 500;
	public static int ARRAY_SIZE = 5000;
	public static void mergeSortManager(Comparable[] a,int version){
		Comparable[] d = a.clone();
		if(version == 1){
			mergeSort(a,d,0,a.length - 1);
		}else if(version == 2){
			mergeSort2(a);
		}
	}
	public static void mergeSort(Comparable[] a,Comparable[] d,int left,int right){
		
		if(left < right){
			int middle = (left + right)>>>1;
			mergeSort(a, d,left, middle);
			mergeSort(a,d, middle + 1, right);
			merge(a,d,left,middle,right);
		}
	}
	public static void mergeSort2(Comparable[] a){
		Comparable[] b = a.clone();
		int s = 1;
		int len = a.length;
		while(s < len){
			mergePass(a,b,s);
			s<<=1;
			mergePass(b, a, s);
			s<<=1;
		}
	}
	private static void mergePass(Comparable[] a, Comparable[] b, int s) {
		int i = 0;
		int len = a.length;
		int off = s<<1;
		while(i<= len - off){
			merge(a, b, i, i + s - 1, i + off -1);
			i = i + off;
		}
		if(i + s < len){
			merge(a, b, i, i + s -1, len - 1);
		}else{
			for(int j = i; j < len; j++){
				b[j] = a[j];
			}
		}
		
	}
	private static void merge(Comparable[] a,Comparable[] d, int left, int middle, int right) {
		
		int i = left;
		int j = middle + 1;
		int index = left;
		
		while((i<= middle) && (j<= right)){
		if(a[i].compareTo(a[j]) <= 0){
			d[index ++] = a[i++];
		}else{
			d[index ++] = a[j++];
		}
		}
		
		/*for(i=left,j=middle + 1; i<=middle&&j<=right;){
		//while((i<= middle) && (j<= right)){
			if(a[i].compareTo(a[j]) <= 0){
				d[index ++] = a[i++];
			}else{
				d[index ++] = a[j++];
			}
		}*/
		if( i > middle){
			for(int k = j; k<=right; k++){
				d[index++] = a[k];
			}
		}else{
			for(int k = i; k<=middle; k++){
				d[index++] = a[k];
			}
		}
		 
		//System.arraycopy(d, left,a,left ,right - left +1);
		for(int k = left; k <= right; k++){//速度 快于System.arraycopy
			a[k] = d[k];
		}
	}
	
	public static void main(String[] args) {
		
		long start = 0;
		List<Comparable[]> list = new ArrayList<Comparable[]>();
		
		
		initDate(list);
		start = System.currentTimeMillis();
		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
			Comparable[] items = (Comparable[]) iterator.next();
			//System.out.println("in" + Arrays.toString(items));
			sort(items,2);
			//System.out.println("out" + Arrays.toString(items));
			
		}
		System.out.println("第二个版本用时:" + (System.currentTimeMillis() - start) + "ms");
		
		initDate(list);
		//System.out.println("in" + Arrays.toString(items));
		start = System.currentTimeMillis();
		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
			Comparable[] items = (Comparable[]) iterator.next();
			//System.out.println("in" + Arrays.toString(items));
			Arrays.sort(items);
			//System.out.println("out" + Arrays.toString(items));
			
		}
		System.out.println("jdk版本用时:" + (System.currentTimeMillis() - start) + "ms");
		
		
		initDate(list);
		//System.out.println("in" + Arrays.toString(items));
		start = System.currentTimeMillis();
		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
			Comparable[] items = (Comparable[]) iterator.next();
			//System.out.println("in" + Arrays.toString(items));
			sort(items,1);
			//System.out.println("out" + Arrays.toString(items));
			
		}
		System.out.println("第一个版本用时:" + (System.currentTimeMillis() - start) + "ms");
		
		
		
	}
	

	public static void sort(Comparable[] items,int version){
		mergeSortManager(items,version);
	}
	public static List<Comparable[]> initDate(List<Comparable[]> list){
		
		Random r = new Random();
		if(list.size() == 0){
			list.add(new Item[ARRAY_SIZE]);
		}
		for(int i = 0; i<LIST_SIZE; i++){
			Item[] items = null;
			if(list.size() > i){
				items = (Item[]) list.get(i);
			}else{
				items = new Item[ARRAY_SIZE];
				list.add(items);
			}
			for(int j = 0; j < ARRAY_SIZE; j++){
				if(items[j] == null){
					items[j] = new Item(r.nextInt(1000));
				}else{
					items[j].setData(r.nextInt(1000));
				}
				
			}
		}
		return list;
	}
}
class Item implements Comparable {
	private int data;
	public Item(int data) {
		this.data = data;
	}
	public Item() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public int compareTo(Object o) {
		Item t = (Item)o;
		return this.data - t.getData();
	}
	public int getData() {
		return data;
	}
	public void setData(int data) {
		this.data = data;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return this.data + "";
	}
	
	
}

 output:

第二个版本用时:1187ms

jdk版本用时:984ms

第一个版本用时:1219ms

分享到:
评论

相关推荐

    fortranchengxue

    程序语句通常从第7列开始,且存在续行、行号等规定。这种格式虽然严格,但对旧代码的兼容性较好。 2.1.2 自由格式 自由格式取消了列限制,允许程序员在任意列开始编写代码,每行最多可容纳132个字符。注释以"!...

    马士兵课程笔记(续4)

    这个文件可能讲解了如何使用内置的`Arrays.sort()`方法,或者是自定义排序算法,如快速排序、归并排序等。此外,也可能探讨了如何处理自定义对象类型的数组排序,这通常涉及`Comparable`或`Comparator`接口的使用。 ...

    数据结构与管理(续七).pdf

    6. 查找与排序:分析查找算法(如顺序查找、二分查找、散列查找)和排序算法(如冒泡排序、快速排序、归并排序)的原理和性能。 7. 文件与数据库管理系统:介绍文件系统的基本原理,以及关系型数据库和非关系型...

    北工大2001年数据结构试题

    - **解析:** 在这些排序算法中,二路归并排序和堆排序的比较次数与初始序列的状态无关,无论序列是否有序,它们都需要进行 O(n log n) 的比较。 **② 不稳定的排序是()** - **答案:** A 和 D (快速排序和简单...

    清华本科教程 续

    【清华本科教程 续】章节主要讲解了计算机科学中关于文件管理的基础知识,涉及文件的概念、分类、逻辑结构、物理结构以及操作。以下是对这些知识点的详细解释: 1. 文件基本概念: 文件是由一系列记录组成的集合,...

    C语言数据结构练习题,学校考试用

    8. **排序与查找**:包括各种排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序等)和查找算法(如顺序查找、二分查找等),这些都是数据结构的重要组成部分。 9. **文件操作**:在C语言中,学会读写...

    程序员编程艺术第一~二十七章集锦与总结(教你如何编程)by_July-带书签目录超清文字版

    排序算法如冒泡排序、快速排序、归并排序等,搜索算法如线性搜索、二分搜索等。这些算法是程序员解决问题的常用工具,理解和掌握它们能提升解决问题的效率。 第十六章至第二十章可能涉及面向对象编程,包括类、对象...

    编程珠玑源码下载编程珠玑书后源代码

    2. **算法**:包括排序算法(如快速排序、归并排序)、查找算法(二分查找、哈希查找)等,通过实例展示算法设计和优化的重要性。 3. **问题解决策略**:书中提出了解决编程问题的一些通用方法,如预处理、分治法、...

    STL标准库模板编程初级.rar

    3. **算法(排序).cpp**:排序算法是STL中非常重要的一部分,例如快速排序、归并排序、插入排序等,它们可以用于对容器中的元素进行升序或降序排列。 4. **排序算法应用.cpp**:这个文件可能包含排序算法的实际应用...

    编程珠玑(美)Jon Bentley

    例如,在排序问题中,作者不仅介绍了经典的排序算法,如快速排序、归并排序,还讨论了如何在特定情况下优化这些算法,使其更适应实际需求。在搜索问题中,书中探讨了二分查找、回溯法等策略,并阐述了它们在实际应用...

    Algorithm-Android-Notes.zip

    例如,通过使用合适的排序算法(如快速排序、归并排序或堆排序),开发者可以优化列表显示,提高数据检索速度,从而提升用户界面的响应性。 其次,算法的应用贯穿于Android开发的各个环节。在内存管理上,垃圾回收...

    程序员面试宝典(全)

    书中可能会详细介绍常见的排序算法(如冒泡排序、快速排序、归并排序)、查找算法(如二分查找、哈希查找)以及数据结构(如栈、队列、链表、树、图、哈希表等),这些都是评估一个程序员逻辑思维能力的关键。...

    leetcode和oj-Algorithm:一个曾经共享一些通用算法的项目

    归并排序 背包问题..持续更新中 LCS 素数筛选法 剑指offer刷题 反转链表 前k小的数 链表相关 镜像的二叉树 Z字型打印二叉树 回溯法 机器人的运动范围 矩阵中的路径 leetcode刷题 动态规划相关 不用加减乘除作加法 ...

    ChoseAlbum

    例如,可以使用哈希表快速查找,或使用快速排序、归并排序等对数据进行高效排序。 6. **网络通信**:如果应用有在线同步或分享功能,那么就需要网络编程技术,如HTTP/HTTPS协议、RESTful API设计,以及可能的...

    毕业设计(论文)管理系统-毕业设计.zip

    6. **算法应用**:在选题匹配、评分计算等环节,可能涉及推荐算法,如协同过滤或基于内容的推荐,以及排序算法,如快速排序或归并排序。 7. **文件管理**:论文提交和评审可能需要支持大文件上传和下载,这涉及文件...

    程序员编程艺术第一~二十七章集锦与总结(教你如何编程)

    - **知识点**:外部排序算法、归并排序。 - **应用场景**:大数据处理、海量日志分析等。 - **第十一章:最长公共子序列(LCS)问题** - **知识点**:动态规划算法、字符串匹配。 - **应用场景**:生物信息学、...

    百度校园招聘历年经典面试题汇总:C++研发 1

    45. **数据库底层排序**:通常使用快速排序、归并排序等,需要考虑内存和磁盘I/O的平衡。 46. **手写vector删除元素**:要处理迭代器失效问题,避免在删除元素后立即使用迭代器。 47. **类设计**:涵盖构造函数、...

    百度校园招聘历年经典面试题汇总:Android岗

    - **解决方案**:使用归并排序或自定义比较器的快速排序算法,避免使用Java自带的排序库。 #### 10. 自定义控件的基本流程 - **创建**:继承View或现有控件。 - **初始化**:在构造函数中初始化属性。 - **绘制**...

Global site tag (gtag.js) - Google Analytics