【算法导论-006】冒泡排序及其优化(BubbleSort)

来源:互联网 发布:cad设计软件下载 编辑:程序博客网 时间:2024/05/13 17:56
1、问题来源
【算法导论】P40 2-2
2、java实现
参考:http://blog.csdn.net/wdzxl198/article/details/8896447
  最基本的方案就不赘述了,下面主要谈两类优化策略。
方案一:减少比较次数
/** * 创建时间:2014年8月6日 下午8:19:14 项目名称:Test *  * @author Cao Yanfeng * @since JDK 1.6.0_21 类说明: */public class BubbleSort {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubint[] array = { 1, -2, 3, -4, -5 };bubbleSort(array);for (int i : array) {System.out.println(i);}}/* * 冒泡排序算法 优化1:带有标志位的:,一旦不交換即array[j]<array[j-1]不存在,则表明已经排序完成,不用再循环 * 优化2:记录最后一次交换发生的位置,该位置之前的地方都已经表示排完序了。这里是前向冒泡法。 */public static void bubbleSort(int[] array) {boolean flag = true;int lastExchangeIndex = 0;while (flag) {flag = false;for (int i = lastExchangeIndex; i < array.length; i++) {for (int j = array.length - 1; j > i; j--) {if (array[j] < array[j - 1]) {array[j] ^= array[j - 1];array[j - 1] ^= array[j];array[j] ^= array[j - 1];flag = true;lastExchangeIndex = j - 1;}}}}}}
方案二:双向扫描,解决不对称问
/*双向冒泡排序,可以改善排序的不对称问题。也用到了方案一中的“优化1”*/public static void advancedBubbleSort(int[] array) {int low=0;int high=array.length-1;int index=low;boolean flag = true;while (high>low&&flag) {flag=false;for (int i = low; i < high; i++) {if (array[i]>array[i+1]) {array[i]^=array[i+1];array[i+1]^=array[i];array[i]^=array[i+1];index=i;flag=true;}}high=index;for (int i =high; i >low; i--) {if (array[i]<array[i-1]) {array[i]^=array[i-1];array[i-1]^=array[i];array[i]^=array[i-1];index=i;flag=true;}}low=index;}}}



0 0