1、问题来源
【算法导论】P40 2-2
2、java实现
最基本的方案就不赘述了,下面主要谈两类优化策略。
方案一:减少比较次数
/**
* 创建时间: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 stub
int[] 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;
}
}
}