什么是冒泡排序法?
?
? ? ??冒泡排序,是指计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2)。
两个优点:
1.“编程复杂度”很低,很容易写出代码;
2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。
?
冒泡排序的过程:
? ? ? ??依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。 由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。 用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i,j的值依次为1,2,...10-i。
?
伪代码实现:
BUBBLE-SORT(A) for i<-----0 to length[A]-1 Do for j<-----length[A]-1 downto i do if A[j]<A[j-1] then exchange A[j]<------>A[j-1]?
图示过程:
未排序时:9 5 32 2 1 4 8 第一趟结果:1 9 5 32 2 4 8 第二趟结果:1 2 9 5 32 4 8 第三趟结果:1 2 4 9 5 32 8 第四趟结果:1 2 4 5 9 32 8 第五趟结果:1 2 4 5 9 8 32
?Java代码实现:
public class BubbleSort { /** * @param args */ public static void main(String[] args) { //定义一个要排序的数组 int [] array={9,5,32,2,1,4,8}; int alen=array.length; //打印未排序前的状态 System.out.println("未排序时:"); for(int i=0;i<alen;i++) { System.out.print(" "+array[i]+" "); } System.out.println(); //调用冒泡排序的方法 BubbleSortWay(array,alen); //打印排好序时的状态 System.out.println("排好序后:"); for(int i=0;i<alen;i++) { System.out.print(" "+array[i]+" "); } System.out.println(); } /** * 冒泡排序的方法 * @param array :待排序的数组 * @param alen:待排序的数组的长度 * 该排序方法是每次将数组中的最小值移到数组的最前面, * 进过数次的排序,便可将数组排好序。 */ private static void BubbleSortWay(int[] array,int alen) { int temp; for(int i=0;i<alen;i++) { for(int j=alen-1;j>i;j--) { if(array[j]<array[j-1]) { temp=array[j]; //交换数据 array[j]=array[j-1]; array[j-1]=temp; } } } } }
?排序结果:
未排序时:
?9 ?5 ?32 ?2 ?1 ?4 ?8?
排好序后:
?1 ? 2 ? 4 ? 5 ? 8 ? 9 ? 32 ?