鸡尾酒排序改自冒泡排序,比冒泡排序性能好些,主要解决问题是某个小元素在右侧,可以快速移至左侧,而不用靠冒泡排序的大循环,每次移动一个位置。比如这个顺序:2,3,4,5,6,7,8,9,1。
【数据结构|排序(二)之鸡尾酒排序】 鸡尾酒排序的思想是:第一次从左侧循环到右侧,然后再从右侧循环到左侧,这是一个大循环。然后再从左侧循环到右侧,右侧循环到左侧。下面代码中做了优化,用了一个标志变量isSorted,如果在某次循环中没有元素位置变化,证明已经是有序的,直接break。
public void testCocktailSort() {
int[] array={2,3,4,5,6,7,8,9,1};
for(int i =0;
i< array.length/2;
i++){
boolean isSorted = true;
//标记是否已经有序
//从左到右的循环
for(int j = i;
j array[j+1]) {
int tem = array[j];
array[j]=array[j+1];
array[j+1] = tem;
isSorted=false;
}
}
if(isSorted){
break;
}
//从右到左的循环
isSorted=true;
for(int j = array.length-i-1;
j>i;
j--){
if(array[j]
和冒泡排序一样,还可以继续优化,用标识符标识出无序区与有序区界限位置,用一个变量记录最后一个变换的位置,有序区内的元素不再参与比较
public void testCocktailSort2() {
int[] array={2,3,4,5,6,7,8,9,1};
int lastRightExchangeIndex=0;
int lastLeftExchangeIndex=0;
int rightUnsortBorder = array.length-1;
int leftUnsortBorder = 0;
for(int i =0;
i< array.length/2;
i++){
boolean isSorted = true;
//标记是否已经有序
//从左到右的循环
for(int j = i;
j array[j+1]) {
int tem = array[j];
array[j]=array[j+1];
array[j+1] = tem;
isSorted=false;
lastRightExchangeIndex =j;
}
}
rightUnsortBorder = lastRightExchangeIndex;
if(isSorted){
break;
}
//从右到左的循环
isSorted=true;
for(int j = array.length-i-1;
j>leftUnsortBorder;
j--){
if(array[j]
实时内容请关注微信公众号,公众号与博客同时更新:程序员星星
文章图片
推荐阅读
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 数据结构和算法|LeetCode 的正确使用方式
- 先序遍历 中序遍历 后序遍历 层序遍历
- 数据结构|C++技巧(用class类实现链表)
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开
- 算法|算法-二分查找
- 数据结构学习指导|数据结构初阶(线性表)
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- java|ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口)- Java - 细节狂魔