数据结构|排序(二)之鸡尾酒排序

鸡尾酒排序改自冒泡排序,比冒泡排序性能好些,主要解决问题是某个小元素在右侧,可以快速移至左侧,而不用靠冒泡排序的大循环,每次移动一个位置。比如这个顺序: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]


实时内容请关注微信公众号,公众号与博客同时更新:程序员星星
数据结构|排序(二)之鸡尾酒排序
文章图片


    推荐阅读