昨天那篇犯了了一个错误,把已经排序好的数据给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
分享到:
相关推荐
数据来源:中国电力统计NJ-2021版
数据来源:中国电力统计NJ-2021版
词根单词 2.2.4 修改版.apk
毕业论文-基于JSP的个人通讯录管理系统设计与实现.docx
数据来源:中国电力统计NJ-2021版
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
数据来源:中国电力统计NJ-2021版
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
数据来源:中国人口与就业统计NJ-2023版
图书借阅管理系统设计与实现及论大学生写作能力.docx
Smart继电器编程器操作手册
毕业设计论文-基于C的人事管理系统设计与实现.docx
数据来源:中国劳动统计NJ-2023版
OPCEV096IPHT手册
数据来源:中国电力统计NJ-2021版
数据来源:中国人口与就业统计NJ-2023版
数据来源:中国人口与就业统计NJ-2023版
基于matlab实现应用遗传算法针对物流配送车辆路径规划问题进行求解.rar
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
数据来源:中国人口与就业统计NJ-2023版