冒泡算法
冒泡算法运行起来非常慢,但在概念上它是排序算法中最简单的,因此冒泡算法在刚开始研究排序技术时是一个非常好的算法。
冒泡算法代码:
// bubbleSort.java
// demonstrates bubble sort
// to run this program: C>java BubbleSortApp
class ArrayBub
{
private long[] a; // ref to array a
private int nElems; // number of data items
//--------------------------------------------------------------
public ArrayBub(int max) // constructor
{
a = new long[max]; // create the array
nElems = 0; // no items yet
}
//--------------------------------------------------------------
public void insert(long value) // put element into array
{
a[nElems] = value; // insert it
nElems++; // increment size
}
//--------------------------------------------------------------
public void display() // displays array contents
{
for(int j=0; j
System.out.print(a[j] + " "); // display it
System.out.println("");
}
//--------------------------------------------------------------
public void bubbleSort()
{
int out, in;
for(out=nElems-1; out>1; out--) // outer loop (backward)
for(in=0; in
if( a[in] > a[in+1] ) // out of order?
swap(in, in+1); // swap them
} // end bubbleSort()
//--------------------------------------------------------------
private void swap(int one, int two)
{
long temp = a[one];
a[one] = a[two];
a[two] = temp;
}
//--------------------------------------------------------------
} // end class ArrayBub
class BubbleSortApp
{
public static void main(String[] args)
{
int maxSize = 100; // array size
ArrayBub arr; // reference to array
arr = new ArrayBub(maxSize); // create the array
arr.insert(77); // insert 10 items
arr.insert(99);
arr.insert(44);
arr.insert(55);
arr.insert(22);
arr.insert(88);
arr.insert(11);
arr.insert(00);
arr.insert(66);
arr.insert(33);
arr.display(); // display items
arr.bubbleSort(); // bubble sort them
arr.display(); // display them again
} // end main()
} // end class BubbleSortApp
为了清晰起见,使用了一个独立的swap方法来执行交换操作,它只是交换数组中的连个数据的值,实际上使用一个独立的swap方法不一定好,因为方法调用会增加一些额外的小消耗,如果写自己使用的排序程序,最好将交换操作这段代码直接放到程序中,这样可以提高一些速度。
冒泡排序的效率
一般来说,数组中有N个数据项,则第一趟排序中有N-1次比较,第二趟中有N-2次,以此类推,这种序列的求和公式为:(N-1)+(N-2)+(N-3)+...+1=N*(N-1)/2,这样算法做了约N2/2次比较(忽略减1,不会有很大差别,特别是当N很大时)。因为在两个数在需要是才交换,所以交换的次数少于比较的次数,如果数据是随机的,那么大概有一半数据需要交换,则交换的次数为N2/4(不过在最坏的情况下,即初始数据好似逆序时,每次比较都需要交换。)
交换和比较操作次数都和N2成正比,由于常数不算在大O表示法中,可以忽略2和4,并且认为冒泡排序运行需要O(N2)时间级别。无论何时,只要看到一个循环嵌套在另一个循环里,就可以怀疑这个算法的运行时间为O(N2级别),外层循环执行N次,内部循环对于每一次外层循环都执行N次,这就意味着将大约需要执行N*N次某个基本操作。