升序排列:从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较完毕,一个最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置。n个数,经过n-1轮比较后完成排序。
代码如下:
public class BubbleSort {
private long a[];
private int nElemts;
public void bubbleSort(){
int out,in;
for(out=nElemts-1;out>1;out--){
for(in=0;in<out;in++){
if(a[in]<a[in+1]){
swap(in,in+1);
}
}
}
}
private void swap(int m,int n){
int temp=m;
a[m]=a[n];
a[n]=temp;
}
}
此算法的目的是将最小的元素放在数组下标为0的位置,并将最大的元素放在数组的最后,也就是下标为n-1的位置。
外层for循环的计数器out从数组的最后开始,即out=n-1,每经过一次循环,out减去1。比out大的元素已经是排序好的元素。
内层for循环的计数器in从0开始,即in=0,每完成一次循环in加1,当in=out时结束内层for循环。在内层for循环中,数组下标为in和in+1的两个数据项进行比较,如果下标为in的数据项大于下标为in+1的数据项,则交换两数据项。
效率问题:
数组中有N个元素,第一塘排序进行N-1次比较,第二次排序进行N-2次比较,一次类推。公式表示为(N-1)+(N-2)+...+1
交换次数可能少于比较次数,在完全逆序的最坏情况下才和比较次数相同
所以比较和交换次数都与N的平方成正比。
无论何时,只要看到一个循环嵌套在另一个循环里就可以怀疑运行时间为O(N2),