昨天那篇犯了了一个错误,把已经排序好的数据给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
分享到:
相关推荐
程序语句通常从第7列开始,且存在续行、行号等规定。这种格式虽然严格,但对旧代码的兼容性较好。 2.1.2 自由格式 自由格式取消了列限制,允许程序员在任意列开始编写代码,每行最多可容纳132个字符。注释以"!...
这个文件可能讲解了如何使用内置的`Arrays.sort()`方法,或者是自定义排序算法,如快速排序、归并排序等。此外,也可能探讨了如何处理自定义对象类型的数组排序,这通常涉及`Comparable`或`Comparator`接口的使用。 ...
6. 查找与排序:分析查找算法(如顺序查找、二分查找、散列查找)和排序算法(如冒泡排序、快速排序、归并排序)的原理和性能。 7. 文件与数据库管理系统:介绍文件系统的基本原理,以及关系型数据库和非关系型...
- **解析:** 在这些排序算法中,二路归并排序和堆排序的比较次数与初始序列的状态无关,无论序列是否有序,它们都需要进行 O(n log n) 的比较。 **② 不稳定的排序是()** - **答案:** A 和 D (快速排序和简单...
【清华本科教程 续】章节主要讲解了计算机科学中关于文件管理的基础知识,涉及文件的概念、分类、逻辑结构、物理结构以及操作。以下是对这些知识点的详细解释: 1. 文件基本概念: 文件是由一系列记录组成的集合,...
8. **排序与查找**:包括各种排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序等)和查找算法(如顺序查找、二分查找等),这些都是数据结构的重要组成部分。 9. **文件操作**:在C语言中,学会读写...
排序算法如冒泡排序、快速排序、归并排序等,搜索算法如线性搜索、二分搜索等。这些算法是程序员解决问题的常用工具,理解和掌握它们能提升解决问题的效率。 第十六章至第二十章可能涉及面向对象编程,包括类、对象...
2. **算法**:包括排序算法(如快速排序、归并排序)、查找算法(二分查找、哈希查找)等,通过实例展示算法设计和优化的重要性。 3. **问题解决策略**:书中提出了解决编程问题的一些通用方法,如预处理、分治法、...
3. **算法(排序).cpp**:排序算法是STL中非常重要的一部分,例如快速排序、归并排序、插入排序等,它们可以用于对容器中的元素进行升序或降序排列。 4. **排序算法应用.cpp**:这个文件可能包含排序算法的实际应用...
例如,在排序问题中,作者不仅介绍了经典的排序算法,如快速排序、归并排序,还讨论了如何在特定情况下优化这些算法,使其更适应实际需求。在搜索问题中,书中探讨了二分查找、回溯法等策略,并阐述了它们在实际应用...
例如,通过使用合适的排序算法(如快速排序、归并排序或堆排序),开发者可以优化列表显示,提高数据检索速度,从而提升用户界面的响应性。 其次,算法的应用贯穿于Android开发的各个环节。在内存管理上,垃圾回收...
书中可能会详细介绍常见的排序算法(如冒泡排序、快速排序、归并排序)、查找算法(如二分查找、哈希查找)以及数据结构(如栈、队列、链表、树、图、哈希表等),这些都是评估一个程序员逻辑思维能力的关键。...
归并排序 背包问题..持续更新中 LCS 素数筛选法 剑指offer刷题 反转链表 前k小的数 链表相关 镜像的二叉树 Z字型打印二叉树 回溯法 机器人的运动范围 矩阵中的路径 leetcode刷题 动态规划相关 不用加减乘除作加法 ...
例如,可以使用哈希表快速查找,或使用快速排序、归并排序等对数据进行高效排序。 6. **网络通信**:如果应用有在线同步或分享功能,那么就需要网络编程技术,如HTTP/HTTPS协议、RESTful API设计,以及可能的...
6. **算法应用**:在选题匹配、评分计算等环节,可能涉及推荐算法,如协同过滤或基于内容的推荐,以及排序算法,如快速排序或归并排序。 7. **文件管理**:论文提交和评审可能需要支持大文件上传和下载,这涉及文件...
- **知识点**:外部排序算法、归并排序。 - **应用场景**:大数据处理、海量日志分析等。 - **第十一章:最长公共子序列(LCS)问题** - **知识点**:动态规划算法、字符串匹配。 - **应用场景**:生物信息学、...
45. **数据库底层排序**:通常使用快速排序、归并排序等,需要考虑内存和磁盘I/O的平衡。 46. **手写vector删除元素**:要处理迭代器失效问题,避免在删除元素后立即使用迭代器。 47. **类设计**:涵盖构造函数、...
- **解决方案**:使用归并排序或自定义比较器的快速排序算法,避免使用Java自带的排序库。 #### 10. 自定义控件的基本流程 - **创建**:继承View或现有控件。 - **初始化**:在构造函数中初始化属性。 - **绘制**...