Hark的数据结构与算法练习之鸡尾酒排序

算法说明

鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序。

鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种。冒泡是从低向高比较排序,鸡尾酒从低向高,从高向低交换着进行排序。大家看一下代码就知道了。

某些特殊有序数组情况下,鸡尾酒排序是效率略好于冒泡排序,例如:

int[] arrayData = { 2, 3, 4, 5, 6, 7, 8, 9, 1 };

鸡尾酒排序只排序一次就能出结果,而冒泡排序就需要8次才能出结果。

代码

使用的是java

package hark.sort.exchangesort;

/*
 * 鸡尾酒排序
 */
public class CocktailSort {
	public static void main(String[] args) {
		int[] arrayData = { 2, 3, 4, 5, 6, 7, 8, 9, 1 };
		CocktailSortMethod(arrayData);
		for (int integer : arrayData) {
			System.out.print(integer);
			System.out.print(" ");
		}
	}

	public static void CocktailSortMethod(int[] arrayData) {
		boolean swapped = true;
		int bottom, top, temp;
		top = arrayData.length - 1;
		bottom = 0;
		while (swapped) {
			swapped = false;

			// 从左向右进行排序
			for (int i = bottom; i < top; i++) {
				if (arrayData[i] > arrayData[i + 1]) {
					temp = arrayData[i];
					arrayData[i] = arrayData[i + 1];
					arrayData[i + 1] = temp;
					swapped = true;
				}
			}
			top -= 1; // 因为已经把最大值移动到最右侧了,所以top=top-1

			// 从右向左进行排序
			for (int i = top; i > bottom; i--) {
				if (arrayData[i] < arrayData[i - 1]) {
					temp = arrayData[i];
					arrayData[i] = arrayData[i - 1];
					arrayData[i - 1] = temp;
					swapped = true;
				}
			}
			bottom += 1; // 因为已经把最小值移动到最右侧了,所以bottom=bottom+1
		}
	}
}

结果

1 2 3 4 5 6 7 8 9 

参考

http://zh.wikipedia.org/wiki/%E9%B8%A1%E5%B0%BE%E9%85%92%E6%8E%92%E5%BA%8F

时间: 2024-10-18 06:56:28

Hark的数据结构与算法练习之鸡尾酒排序的相关文章

Hark的数据结构与算法练习之Bogo排序

算法说明 Bogo排序是交换排序的一种,它是一种随机排序,也是一种没有使用意义的排序,同样也是一种我觉得很好玩的排序. 举个形象的例子,你手头有一副乱序的扑克牌,然后往天上不停的扔,那么有一定机率会变成有序的. 哈哈,就是这样. 看一下代码大家就知道了. 代码 使用的是java package hark.sort.exchangesort; import java.util.Random; /* * Bogo排序 */ public class BogoSort { public static

Hark的数据结构与算法练习之奇偶排序

算法说明 奇偶排序又叫奇偶换位排序,砖排序.它是一种交换排序,也是冒泡的一个变种 顾名思义,奇偶排序,其实就是先循环奇数位,然后将奇数位与偶数位比较计算. 然后再循环偶数位,再和奇数位比较运算.看一下代码大家就明白了. 据wiki所述,这种算法是一种并行算法,个人对这块现在不太理解,没明白这块所谓的并行是什么意思,现在只是完成了一个单机版,将来如果明白了再过来进行补充啦. 代码 使用的是java package hark.sort.exchangesort; /* * 奇偶排序 */ publi

Hark的数据结构与算法练习之煎饼排序

算法说明 假设煎锅里边有N个煎饼摞在了一起,它们大小不一并且顺序不一致,我们需要通过拿铲子将它们不停的翻个,进行排序,最终得到一个底下是大的煎饼,上边是小的煎饼的序列.这个排序的过程就是煎饼排序. 这个算法有两种解,一种是普通解,一种是最优解. 普通论证: 例如你的初始煎饼顺序是[2,4,3,1] 然后2与4交换位置,然后4与1交换位置,得出[1,3,2,4]. 然后3与1交换位置,接着3与2交换位置,得出[2,1,3,4]. 最后2与1交换位置,得出结果[1,2,3,4] 通过普通解的过程,我

Hark的数据结构与算法练习之图书馆排序

算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移.而图书馆排序的思路就是将每个元素后边都预留N个空间(例如预留10个元素空间),这样往某个元素前插入时,在预留空间足够的前题下,只会移动少少几个的元素. 代码 因为4月要考试,所以代码暂不写,以后有时间时补上 参考 http://www.cnblogs.com/kkun/archive/2011/1

Hark的数据结构与算法练习之希尔排序

算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增量)来对数列分组进行交换排序,最终使数列几乎有序,最后再执行插入排序,统计出结果. 通过increment=n/2, 也就是如果9个数的话,增量为4,2,1.   如果是20个数的话,增量就是10,5,2,1.  当increment为1时,其实对几乎有序的数列进行插入排序啦啦. 时间复杂度 O(n

Hark的数据结构与算法练习之桶排序

算法说明 桶排序的逻辑其实特别好理解,它是一种纯粹的分而治之的排序方法. 举个例子简单说一下大家就知道精髓了. 假如对11,4,2,13,22,24,20 进行排序. 那么,我们将4和2放在一起,将11,13放在一起,将22,24,20放在一起.  然后将这三部分分别排序(可以根据实现情况任意选择排序方式,我的代码中使用的是快排),将子数组排序后,再顺序输出就是最终排序结果了(大概应该明白了,我们是根据数字大小进行分组的,故而顺序输出即可) 怎么样,很简单吧. 具体实现大家看代码就行,我实现的其

Hark的数据结构与算法练习之计数排序

算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定性而做的数据累加,大家听我说说就知道了: 1.首先,先取出要排序数组的最大值,假如我们的数组是int[] arrayData = { 2, 4, 1, 5, 6, 7, 4, 65, 42 };,那么最大值就是65.(代码17-21行就是在查找最大值) 2.然后创建一个计数数组,计数数组的长度就是我

Hark的数据结构与算法练习之地精(侏儒)排序

算法说明 地精排序是交换排序的一种,它是冒泡排序的一种改良,我感觉和鸡尾酒排序挺像的. 不同之处是鸡尾酒排序是从小到大,然后再从大到小切换着排序的.而地精排序是上来先从小到大排序,碰到交换到再从大到小,接着再从小到大进行排序. 举个例子: 对8,6,4,5,1进行升序排序 1.8与6交换,结果是 {6,8,4,5,1} 2.8与4交换,结果是 {6,4,8,5,1} 3.4与6交换,结果是 {4,6,8,5,1} 4.5与8交换,结果是 {4,6,5,8,1} 5.6与5交换,结果是 {4,5,

数据结构和算法17 之拓扑排序

本文为博主原创文章,转载请注明出处:http://blog.csdn.net/eson_15/article/details/51194219 这一节我们学习一个新的排序算法,准确的来说,应该叫"有向图的拓扑排序".所谓有向图,就是A->B,但是B不能到A.与无向图的区别是,它的边在邻接矩阵里只有一项(友情提示:如果对图这种数据结构部不太了解的话,可以先看一下这篇博文:数据结构和算法之 无向图.因为拓扑排序是基于图这种数据结构的). 有向图的邻接矩阵如下表所示: A B C A