java常用的排序算法,鸡尾酒排序就像钟摆一样,第一轮从左往右,第二轮从右往左,第三轮从左往右。。。。直到元素没有位置交换的时候,说明已经有序,停止交换。是冒泡算法的升级版
package shujujiegou;
import java.util.Arrays;
/**
* 鸡尾酒排序就像钟摆一样,第一轮从左往右第二轮从右往左,第三轮从左往右。。。。
* 直到元素没有位置的交换证明已经有序,排序结束
* @author TomCat
*
*/
public class CockTailSort {
public static void sort(int[] array) {
int temp=0;
for(int i=0;i<array.length/2;i++) {
boolean isSorted=true; //有序标记,每一轮的出事为true
//奇数轮,从左往右比较
for(int j=i;j<array.length-i-1;j++) {
if(array[j]>array[j+1]) {
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
isSorted=false;//有元素的交换,所以不是有序的,标记置为false
}
}
if(isSorted) {
break;
}
//开始偶数论的比较
isSorted=true;
for(int j=array.length-i-1;j>i;j--) {
if(array[j]<array[j-1]) {
temp=array[j];
array[j]=array[j-1];
array[j-1]=temp;
isSorted=false;//有元素的交换,所以不是有序的,标记置为false
}
}
if(isSorted) {
break;
}
}
}
//优化后的鸡尾酒排序
public static void sort1(int[] array) {
int temp=0;
int lastRightExchange=0;//记录右侧最后一次元素交换的位置
int lastLeftExchange=0;//记录左侧最后一次元素交换的位置
int rightSortBorder=array.length-1;//无序数组的右边界。每次比较到这里为止
int leftSortBorder=0;//左边界
for(int i=0;i<array.length/2;i++) {
boolean isSorted=true;
for(int j=leftSortBorder;j<rightSortBorder;j++) {
if(array[j]>array[j+1]) {
temp=array[j];
array[j+1]=array[j];
array[j]=temp;
isSorted=false;
lastRightExchange=j;
}
}
rightSortBorder=lastRightExchange;
if(isSorted) {
break;
}
isSorted=true;
for(int j=rightSortBorder;j>leftSortBorder;j--) {
if(array[j]<array[j-1]) {
temp=array[j];
array[j]=array[j-1];
array[j-1]=temp;
//有元素交换,所以不是有序,标记变为false
isSorted=false;
lastLeftExchange=j;
}
}
leftSortBorder=lastLeftExchange;
if(isSorted) {
break;
}
}
}
public static void main(String[] args) {
int[] array=new int[] {1,4,3,2,5,6,3,5,9};
sort(array);
System.out.println(Arrays.toString(array));
}
}