冒泡排序
冒泡排序是一种比较简单的排序算法。它会遍历若干次要排序的序列,每次排序的时候,它
都会从前往后比较相邻两个数的大小;如果前者比后者大,就交换他们的位置,这样一次遍
历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历的时候,第二大的元素就
被排列在最大的元素之前。重复上述排列过程,直达整个数列排列完毕。
冒泡排序说明
1 import java.io.*; 2 class test 3 { 4 public static void BubbleSort(int[] array){ 5 int len = array.length; 6 if( len <= 0) 7 return; 8 for (int i = len - 1; i >= 0 ; i-- ) { 9 for(int j = 0; j < i; j ++){ 10 if(array[j] > array[j+1]) 11 swap(array, j, j+1); 12 } 13 } 14 } 15 16 public static void swap(int[] array, int pos1, int pos2){ 17 int val = array[pos1]; 18 array[pos1] = array[pos2]; 19 array[pos2] = val; 20 } 21 public static void main (String[] args) { 22 int[] array = {20,40,30,10,60,50}; 23 BubbleSort(array); 24 for(int i: array) 25 System.out.println(i); 26 } 27 }
下面以 {20,40,30,10,60,50}为例来说明:
可以查看上图的排序过程:
第一趟排序选出了数组中最大的元素60,
第二趟排序选出了数组中对打的元素50,
∙∙∙∙∙∙∙
第五趟排序结束之后,整个数组就是有序的了。
但是从上图中,我们可以看到,其实在第三趟的时候,整个数组就已经完成了排序,第四趟
和第五趟并没有任何进行数据的交换,那么就可以对冒泡做一个简单的优化,增加一个标志
位,判断这一趟是否有数据的交换,如果没有那么就说明数组中数据已经排序完毕:
1 public static void BubbleSortChange(int[] array) { 2 int len = array.length; 3 if( len <= 0) 4 return; 5 for (int i = len - 1; i >= 0 ; i-- ) { 6 int flag = 0; 7 for(int j = 0; j < i; j ++){ 8 if(array[j] > array[j+1]){ 9 swap(array, j, j+1); 10 flag = 1; 11 } 12 13 } 14 if(flag == 0) 15 break; 16 } 17 } 18 public static void swap(int[] array, int pos1, int pos2){ 19 int val = array[pos1]; 20 array[pos1] = array[pos2]; 21 array[pos2] = val; 22 }
上面的排序实现的是从小到大的排序,那么从大到小怎么实现的,其实就是把上面的过程转
换:
第一趟遍历选出最小的那个,第二趟遍历选出次小的那个、、、、
直到n趟遍历完毕!!(变换一下中间的判断的符号)
public static void BubbleSortChange(int[] array) { int len = array.length; if( len <= 0) return; for (int i = len - 1; i >= 0 ; i-- ) { int flag = 0; for(int j = 0; j < i; j ++){ if(array[j] > array[j+1]){ swap(array, j, j+1); flag = 1; } } if(flag == 0) break; } } public static void swap(int[] array, int pos1, int pos2){ int val = array[pos1]; array[pos1] = array[pos2]; array[pos2] = val; }
冒泡排序的时间复杂度和稳定性
冒泡排序的时间复杂度是O(N2)。
假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N1
次!因此,冒泡排序的时间复杂度是O(N2)。
冒泡排序稳定性
冒泡排序是稳定的算法,它满足稳定算法的定义。
算法稳定性 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序
之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!