冒泡排序
冒泡排序的英文Bubble Sort,是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。
从序列的一端开始往另一端冒泡,依次比较相邻的两个数的大小。
设数组长度为N。
1.每轮比较相邻的前后两个数据,如果前面数据大于或者小于后面的数据,就将二个数据交换。
2.这样每轮对数组的第0个数据到N-1个数据进行一次遍历后,最大或者最小的一个数据就到数组第N-1个位置。
3. 第一轮比较到下标为N-1的数据(最后一个),以后每次比较都-1。
时间复杂度
若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均为最小值。所以,冒泡排序最好的时间复杂度为O(n)
C(min) = n -1 ,M(min) = 0
若初始文件是反序的,需要进行n-1 趟排序。每趟排序要进行n-1 次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值,最坏的时间复杂度为O()。
因此冒泡排序总的平均时间复杂度为O()
/**
* 冒泡排序
* @param arr
*/
private void sort(int [] arr){
for(int i = 0 ; i < arr.length - 1 ; i++){
boolean change = false;
for(int j = 0 ; j < arr.length - 1 - i ; j++){
if(arr[j] > arr [ j + 1]){
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j]=temp;
change = true;
}
}
if(!change)
return;
}
}
/**
* 双冒泡排序
* @param arr
*/
private void sortT(int[] arr){
int left = 0;
int right = arr.length - 1;
while (left < right){
for(int i = 0 ;i < right ;i++){
if(arr[i] > arr [ i + 1]){
int temp = arr[i+1];
arr[i+1] = arr[i];
arr[i]=temp;
}
}
left ++;
for(int j = right - left ; j > 0 ; j--){
if(arr[j-1] > arr [ j]){
int temp = arr[j-1];
arr[j-1] = arr[j];
arr[j]=temp;
}
}
right --;
}
}