冒泡排序

来源:互联网 发布:广州凶宅数据库网址 编辑:程序博客网 时间:2024/06/06 09:30

基本思想:  

         将序列中的第1个元素与第2个元素进行比较,若前者大于后者,则将第1个元素与第2个元素进行位置交换,否则不换。  

再将第2个元素与第3个元素进行比较,同样若前者大于后者,则将第2个元素与第3个元素进行位置交换,否则不换。  

以此类推,直到将第n-1个元素与第n个元素进行比较为止。  

这个过程称为第1趟冒泡排序。经过第1趟冒泡排序后,将长度为n的序列中最大的元素置于了序列的尾部,即第n个位置上。  

然后再对剩下的n-1个元素做同样的操作,这叫做第2趟冒泡排序。经过了第2趟的冒泡排序,将剩下的n-1个元素中最大的元素置于了序列的n-1的位置上。  

如此进行下去,当执行完第n-1趟的冒泡排序后,就可以将序列中剩下2个元素中的最大的元素置于了序列的第2个位置上。第1个位置上的元素就是该序列中最小
的元素。  这样冒泡排序完成。  

  元素序列 {3,6,4,2,11,10,6} 的冒泡排序过程如下  

初始状态:{3,6,4,2,11,10,6} 

第1趟排序:{3,4,2,6,10,6,11}  

第2趟排序:{3,2,4,6,6,10,11}  

第3趟排序:{2,3,4,6,6,10,11}  

第4趟排序:{2,3,4,6,6,10,11}  

第5趟排序:{2,3,4,6,6,10,11}  

第6趟排序:{2,3,4,6,6,10,11}  

从第4趟排序开始,序列本身就没再发生任何变化,从第4趟排序操作往下的比较运算其实都可以不再进行。如果某躺排序过程中只有元素之间的比较操作,而没
有发生元素的位置变化,那就说明到本趟排序为止,序列中的元素已经按值有序,因此不需要再进行下一趟排序了,排序可以结束。  

在算法中设置一个标志变量flag,规定当flag=1时,说明本趟排序中仍有元素交换的动作,还需要进行下一趟比较。当flag=0时,说明本趟排序中已经没有了元
素的交换,只有元素的比较,因此表明序列已经按值有序,排序可以停止。  

public class BubbleSort {//冒泡排序private static void bubbleSort(int[] num) {int flag = 1;int temp;for (int i = 0; i < num.length - 1 && flag == 1; i++) {flag = 0;for (int j = 0; j < num.length - 1 - i; j++) {if (num[j] > num[j + 1]) {temp = num[j];num[j] = num[j + 1];num[j + 1] = temp;flag = 1;}}}}public static void main(String[] args) {int[] num = { 3,6,4,2,11,10,6 };BubbleSort.bubbleSort(num);for (int i = 0; i < num.length; i++) {System.out.print(num[i] + " ");}}}