排序(二)之鸡尾酒排序
鸡尾酒排序改自冒泡排序,比冒泡排序性能好些,主要解决问题是某个小元素在右侧,可以快速移至左侧,而不用靠冒泡排序的大循环,每次移动一个位置。比如这个顺序: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]
实时内容请关注微信公众号,公众号与博客同时更新:程序员星星

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
