冒泡排序:
public void sort(){
int out,in;//out指向已经排好序的前一个
for( out=nElements-1;out>1;out--){
for(in=0;in<out;in++){
if(arr[in]>arr[in+1]){
swap(in,in+1);//相邻的两个元素比较,交换
}
}
}
}//实现冒泡排序
相邻的元素两两比较,out指向末端待排序的元素。
10个数据项,第一次排序9次比较,第二次 8次比较。。。一共9+8+。。。+1=45次
N个数据 1+2+...+N+(N+1)+(N+2)=N(N+1)/2 约做了N^2/2次比较,大约N^2/4次交换(概率,两个数据交换概率1/2)时间复杂度:O(N^2)
数组初始状态:
如图,两两比较,交换(大小颠倒时)
每完成一轮两两比较,即inner+1到达未排序序列的末端,就能将未排序中的一个元素排好序(最大的)。
排好序的状态:
完整代码:
package TwoArray;
/**
* 冒泡排序 最小的数据项放在最开始,最大的放后面 10个数据项,第一次排序9次比较,第二次 8次比较。。。一共9+8+。。。+1=45次
* N个数据 N+(N+1)+(N+2)...+1=N(N+1)/2 约做了N^2/2次比较,大约N^2/4次交换(概率,两个数据交换概率1/2)时间复杂度:O(N^2)
* @author zhic
*
*/
public class BubbleSort {
int[] arr;
int nElements;
public BubbleSort(int max) {
arr = new int[max];
nElements = 0;
}//构造函数
public void insert(int value){
arr[nElements] = value;
nElements++;
}
public void display(){
for(int i=0;i<nElements;i++){
System.out.print(arr[i] + " ");
}
}
public void swap(int one,int two){
int temp = arr[one];
arr[one] = arr[two];
arr[two] = temp;
}//交换两个下标对应的数组值
public void sort(){
int out,in;//out指向已经排好序的前一个
for( out=nElements-1;out>1;out--){
for(in=0;in<out;in++){
if(arr[in]>arr[in+1]){
swap(in,in+1);//相邻的两个元素比较,交换
}
}
}
}//实现冒泡排序
public static void main(String[] args){
int max = 50;
BubbleSort arr = new BubbleSort(max);
arr.insert(10);
arr.insert(0);
arr.insert(90);
arr.insert(9);
arr.insert(30);
arr.insert(10);
arr.insert(20);
arr.insert(40);
arr.insert(70);
arr.display();
System.out.println();
arr.sort();
arr.display();
}
}