【算法】算法第四版学习笔记 -- 冒泡排序与鸡尾酒排序

鸡尾酒排序是冒泡排序的变形,可以减少外层循环的次数。元素之间的对比次数与交换次数不会得到优化,同时要维护布尔值的判断,所以这两个排序效能都较差。

排序类算法模板,类: 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次交换

乱序情况下,冒泡排序(使用交换标识优化)与鸡尾酒排序的效能相近。

猜你喜欢

转载自blog.csdn.net/chenghan_yang/article/details/85984907
今日推荐