首页 新闻 会员 周边 捐助

为什么使用冒泡排序时,数据逆序反而比随机的要快

0
悬赏园豆:10 [待解决问题]

以下是截图:

【数组都是插满数据的】

PS:数据排序是按升序排序的,逆序时为降序的....

 真心请各位赐教....本人不胜感激....

KeenLeung的主页 KeenLeung | 初学一级 | 园豆:177
提问于:2012-11-14 23:43
< >
分享
所有回答(2)
0

因为遍历一遍以后发现已经排好序程序就结束了,冒泡排序对已经排好序的效率是最高的

田林九村 | 园豆:2367 (老鸟四级) | 2012-11-15 07:52

哦,我是按升序排序的,逆序的情况时,一开始所有数据都是逆序的...

支持(0) 反对(0) KeenLeung | 园豆:177 (初学一级) | 2012-11-15 12:11
0

要不试试顺序怎么样,可能就很慢了。

angelshelter | 园豆:9914 (大侠五级) | 2012-11-15 10:06

我的是按升序排序的,一开始时,所有数据都是逆序的.....

支持(0) 反对(0) KeenLeung | 园豆:177 (初学一级) | 2012-11-15 12:12

@KeenLeung: 能不能一窥程序

支持(0) 反对(0) angelshelter | 园豆:9914 (大侠五级) | 2012-11-15 12:15

@angelshelter: 

import java.util.Date;

class BubbleSortApp {
public static void main(String[] args) {
for (int maxSize = 10000; maxSize <= 50000; maxSize += 10000) {
ArrayBub arr;
arr = new ArrayBub(maxSize);

for (int j = 0; j < maxSize; j++) {
long n = (long) (java.lang.Math.random() * (maxSize - 1));
arr.insert(n);
}
/*
* for(int j=maxSize-1;j>=0;j--){ arr.insert(j); }
*/

Date before = new Date();
// arr.display();
arr.bubbleSort();
// arr.display();
Date after = new Date();
long time = after.getTime() - before.getTime();
System.out.println("数组的个数" + " " + maxSize + " " + "冒泡排序时间为"
+ " " + time + "ms" + " " + "(随机)");
}
}
}

支持(0) 反对(0) KeenLeung | 园豆:177 (初学一级) | 2012-11-15 13:17

@angelshelter: 

class ArrayBub {
private long[] a;
private int nElems;

public ArrayBub(int max) {
a = new long[max];
nElems = 0;
}

public void insert(long value) {
a[nElems] = value;
nElems++;
}

public void display() {
for (int j = 0; j < nElems; j++)
System.out.print(a[j] + " ");
System.out.println(" ");
}

public void bubbleSort() {
int out, in;
for (out = nElems - 1; out > 1; out--)
for (in = 0; in < out; in++)
if (a[in] > a[in + 1])
swap(in, in + 1);

}

public void swap(int one, int two) {
long temp = a[one];
a[one] = a[two];
a[two] = temp;
}

}

支持(0) 反对(0) KeenLeung | 园豆:177 (初学一级) | 2012-11-15 13:19

@KeenLeung: 原因找到了

首先你的算法好像写错了

public void bubbleSort() {
int out, in;
for(out=0;out<nElems;out++)
for(in=1;in<nElems-out;in++)
if(a[in-1]>a[in])
swap(in-1,in);
}

然后用改好后的试,还是逆序的快。

我就很好奇,就统计了一下执行swap(交换方法)的次数

 

执行交换的次数24787175
数组的个数 10000 冒泡排序时间为 750ms (随机)
执行交换的次数100417100
数组的个数 20000 冒泡排序时间为 3016ms (随机)
执行交换的次数49995000
数组的个数 10000 冒泡排序时间为 828ms (逆序)
执行交换的次数199990000
数组的个数 20000 冒泡排序时间为 3406ms (逆序)

得出的结论是

每次执行swap的时间不同,然后逆序在少量数据的时候,执行次数多了,但总时间还是比随机少。

支持(0) 反对(0) angelshelter | 园豆:9914 (大侠五级) | 2012-11-15 14:38

@angelshelter: 

奇怪,修改了以后,结果是这样的:

            数组大小            时间ms         交换次数

随机       10^4               506              24870137

             10^5               2067            100973415

             10^6               4760            224607593

 

逆序      10^4                612              49995000

            10^5                2491           199990000

            10^6                 5350          449985000

支持(0) 反对(0) KeenLeung | 园豆:177 (初学一级) | 2012-11-16 01:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册