因为遍历一遍以后发现已经排好序程序就结束了,冒泡排序对已经排好序的效率是最高的
哦,我是按升序排序的,逆序的情况时,一开始所有数据都是逆序的...
要不试试顺序怎么样,可能就很慢了。
我的是按升序排序的,一开始时,所有数据都是逆序的.....
@KeenLeung: 能不能一窥程序
@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" + " " + "(随机)");
}
}
}
@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;
}
}
@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的时间不同,然后逆序在少量数据的时候,执行次数多了,但总时间还是比随机少。
@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