假设有N个运动员,编号0--N-1,从最左边开始:0与1比较,若0比1高,两者交换;接着1与2比较,若1比2高1与2交换……此次最高的排到最右边了完成了一个排序;再一次从左到右比较到N-2号,此次排序次高的排到了N-2号……
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);
}
}
思路:将最小的数据项放在数组的0位置,将最大数据放在nElems-1,外层for计数器out从数组末尾开始,每经过一次循环out-1,下标大于out数据都已经是排好序的了。out每完成一次内部循环左移一位,因此下次内层循环就不再处理那些已经排好序的数据了。
//bubbleSortArray.java
package Structure;
class bubbleSortArray{
private long[] a;
private int nElems;
public bubbleSortArray(int max){
a = new long[max];
nElems = 0;
}
public void insert(long value){
a[nElems] = value;
nElems++;
}
public void display(){
for(int i = 0;i<nElems;i++){
System.out.print(a[i]+" ");
}
}
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);
}
}
private void swap(int one, int two) {
// TODO Auto-generated method stub
long temp = a[one];
a[one] = a[two];
a[two] = temp;
}
}
//bubbleSortTest.java
package Structure;
public class bubbleSortTest {
public static void main(String[] args){
int maxSize = 100;
bubbleSortArray arr;
arr = new bubbleSortArray(maxSize);
arr.insert(78);
arr.insert(178);
arr.insert(708);
arr.insert(278);
arr.insert(728);
arr.insert(718);
arr.insert(708);
arr.insert(780);
arr.insert(478);
arr.display();
arr.bubbleSort();
System.out.println();
arr.display();
}
}
/*78 178 708 278 728 718 708 780 478
78 178 278 478 708 708 718 728 780 */