鸡尾酒排序是冒泡排序的变形,可以减少外层循环的次数。元素之间的对比次数与交换次数不会得到优化,同时要维护布尔值的判断,所以这两个排序效能都较差。
排序类算法模板,类: Example
https://blog.csdn.net/chenghan_yang/article/details/83002422
package bubble_sort;
import java.util.Arrays;
import sort.Example; // 看排序类算法模板https://blog.csdn.net/chenghan_yang/article/details/83002422
public class BubbleOptimization extends Example {
public static void sort(Comparable[] a)
{
int N = a.length;
int count = 0;
int exchangeCount = 0;
boolean isExchange; // 设置一个是否交换的标识
for (int i = 0; i < N - 1; i++)
{
isExchange = false; // 每次循环开始标识置false
for (int j = 0; j < N - 1 -i; j++)
{
count++;
if (less(a[j+1], a[j]))
{
exch(a, j+1, j);
isExchange = true; // 发生交换改变标记
exchangeCount++;
}
}
System.out.println(Arrays.toString(a));
// i == N-2 这个条件是为了打印美观而加上去的,不影响实现
if (!isExchange || (i == N-2)) // 如果一轮交换下来没有发生交换,则必然有序,不用开始下一轮循环
{
System.out.println("一共比较了" + count + "次," + "完成了" + exchangeCount + "次交换");
return;
}
}
}
}
package bubble_sort;
import java.util.Arrays;
import sort.Example;
public class BubbleOptimizationCockTail extends Example{
public static void sort(Comparable[] a)
{
int N = a.length;
boolean isExchange;
int count = 0;
int exchangeCount = 0;
for (int i = 0; i < N/2; i++)
{
isExchange = false;
for (int j = i; j < N - 1 -i; j++)
{
count++;
if (less(a[j+1], a[j]))
{
exch(a, j+1, j);
isExchange = true;
exchangeCount++;
}
}
if (!isExchange)
{
System.out.println("一共比较了" + count + "次," + "完成了" + exchangeCount + "次交换");
return;
}
System.out.println(Arrays.toString(a));
isExchange = false;
for (int j = N - 1 - i; j > i; j--)
{
count++;
if (less(a[j], a[j-1])) {
exch(a, j, j-1);
isExchange = true;
exchangeCount++;
}
}
if (!isExchange)
{
System.out.println("一共比较了" + count + "次" + "完成了" + exchangeCount + "次交换");
return;
}
System.out.println(Arrays.toString(a));
}
}
}
测试类
package bubble_sort;
public class Test {
public static void main(String[] args) {
Integer[] b = {2,3,4,5,1};
BubbleOptimization.sort(b);
Integer[] c = {2,3,4,5,1};
BubbleOptimizationCockTail.sort(c);
}
}
[2, 3, 4, 1, 5]
[2, 3, 1, 4, 5]
[2, 1, 3, 4, 5]
[1, 2, 3, 4, 5]
一共比较了10次,完成了4次交换
[2, 3, 4, 1, 5]
[1, 2, 3, 4, 5]
一共比较了10次,完成了4次交换
乱序情况下,冒泡排序(使用交换标识优化)与鸡尾酒排序的效能相近。