欢迎关注WX公众号:
鸡尾酒排序算法(java)
####文章链接
知识点
1、鸡尾酒排序算法介绍;
2、算法的实现java;
概述
鸡尾酒算法:就是把一组数字,分别向前和向后将每个最大(最小)的数字分别往前后推。每一次推的结果一定是,最大(最小)的一定会在最前或者最后。
算法实现
//示例入参数组; src = {5,2,4,1,3}
public int[] cocktail_sort(int[] src){
long timeS = System.currentTimeMillis();
//该算法是只需要向左或右推数组长度的一半次数就够了
for (int i = 0; i < src.length / 2; i++){
//第一个for循环是将数组中最大的数,向最后推。结果最大的数总会在最右边
//例如上面的数组
//第一次:5因为最大,所以在执行下面循环之后,一定位于数组最后面。(以此类推,第二次,是4最大,会位于5的前面)
for (int j = i; j < src.length - i - 1; j++){
if (src[j] > src[j + 1]){
int temp = src[j];
src[j] = src[j + 1];
src[j + 1] = temp;
}
System.out.println("swap biggest number : " + Arrays.toString(src));
}
//第二个循环是将数组中最小的数,往最前面推。结果最小的数总会在最右边
//例如上面的数组
//第一次往右,1是最小,循环执行完毕后,1一定位于数组最前面。(类似地,第二次就会把第二小的数字2,向左推到1的后面)
for (int j = src.length - 1 - (i + 1); j >= i; j--){
if (src[j] > src[j + 1]){
int temp = src[j];
src[j] = src[j + 1];
src[j + 1] = temp;
}
System.out.println("swap smallest number : " + Arrays.toString(src));
}
//当执行完一轮循环之后,向右和向左推的数就不会再参与下一轮的循环了,不然就浪费资源了。
}
long timeE = System.currentTimeMillis();
System.out.println("take time = " + (timeE - timeS));
System.out.println("final result : " + Arrays.toString(src));
return src;
}
在as中使用单元测试,如下:
@Test
public void sortTest() {
aaa a = new aaa();
int[] src = new int[]{11,4,3,54,2,32,45,23,55,15,28,99,100,92,22};
a.cocktail_sort(src);
}
最后的结果是:
swap smallest number : [2, 3, 4, 11, 15, 22, 23, 28, 32, 45, 54, 55, 92, 99, 100]
swap biggest number : [2, 3, 4, 11, 15, 22, 23, 28, 32, 45, 54, 55, 92, 99, 100]
swap biggest number : [2, 3, 4, 11, 15, 22, 23, 28, 32, 45, 54, 55, 92, 99, 100]
swap smallest number : [2, 3, 4, 11, 15, 22, 23, 28, 32, 45, 54, 55, 92, 99, 100]
swap smallest number : [2, 3, 4, 11, 15, 22, 23, 28, 32, 45, 54, 55, 92, 99, 100]
take time = 31
final result : [2, 3, 4, 11, 15, 22, 23, 28, 32, 45, 54, 55, 92, 99, 100]
Process finished with exit code 0
总结
鸡尾酒排序是一个定向的冒泡排序,是双向的排序。其最糟或者平均所花费的次数是O(n^2)。