冒泡排序
冒泡排序顾名思义就是整个过程就像气泡一样往上升,单向冒泡排序的基本思想是(假设由小到大排序):对于给定的 n 个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较和换位后,n 个记录中的最大记录将位于第 n位;然后对前(n-1)个记录进行第二轮比较;重复该过程直到进行比较的记录只剩下一个为止。
以数组 {45,3,2,5,7,8,32,9,1,22,0} 为例,冒泡排序的具体步骤如下:
[3, 2, 5, 7, 8, 32, 9, 1, 22, 0, 45]
[2, 3, 5, 7, 8, 9, 1, 22, 0, 32, 45]
[2, 3, 5, 7, 8, 1, 9, 0, 22, 32, 45]
[2, 3, 5, 7, 1, 8, 0, 9, 22, 32, 45]
[2, 3, 5, 1, 7, 0, 8, 9, 22, 32, 45]
[2, 3, 1, 5, 0, 7, 8, 9, 22, 32, 45]
[2, 1, 3, 0, 5, 7, 8, 9, 22, 32, 45]
[1, 2, 0, 3, 5, 7, 8, 9, 22, 32, 45]
[1, 0, 2, 3, 5, 7, 8, 9, 22, 32, 45]
[0, 1, 2, 3, 5, 7, 8, 9, 22, 32, 45]
程序示例如下:
1 /** 2 * 冒泡排序: 先将最大的数沉下去,再进行第二次-1 的排序 3 */ 4 public class BubbleSorting { 5 //temp 是过度字段 6 int i,j,temp; 7 //排序方法:从小到大排序 8 public void sort(Integer[] arr){ 9 for(int i =1;i<arr.length;i++) { 10 for(int j=0;j<arr.length-i;j++) { 11 if(arr[j]>arr[j+1]) { 12 int temp = arr[j]; 13 arr[j]=arr[j+1]; 14 arr[j+1]=temp; 15 } 16 } 17 System.out.println(Arrays.asList(arr).toString()); 18 } 19 } 20 21 public static void main(String[] args) { 22 Integer[] s = {45,3,2,5,7,8,32,9,1,22,0}; 23 new BubbleSorting().sort(s); 24 } 25 26 }
程序输入为:[0, 1, 2, 3, 5, 7, 8, 9, 22, 32, 45]
总结:若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数 和记录移动次数
均达到最小值:所以,冒泡排序最好的时间复杂度为
;若初始文件是反序的,需要进行 n-1 趟排序。每趟排序要进行 n-i 次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
冒泡排序的最坏时间复杂度为:
综上,因此冒泡排序总的平均时间复杂度为:
。