鸡尾酒排

鸡尾酒排序

鸡尾酒排序是冒泡排序的一种变形。先找到最小的数字,放在第一位,再找到最大的数字放在最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。

鸡尾酒排序的时间复杂度为 O(n^2)。

具体实现如下:

    

public class SortTest {

    public static void main(String[] args) {
        int[] arr = {14, 12, 4, 6, 9, 16, 11, 8, 3, 1};
        cocktailSort(arr);
        for (int x : arr){
            System.out.print(x+", ");
        }
    }
    /*
       鸡尾酒排序(从小到大)
     */
    private static void cocktailSort(int[] arr){
        int m=0,n=arr.length-1;
        while (m < n){
            /* m=0时(即第一次),for循环结束后获取到最大的一个数,排在最后 */
           /*        12, 4, 6, 9, 14, 11, 8, 1, 3, 16,   */
            for (int i = m; i < n; i++){
                if(arr[i] > arr[i+1]){
                    swap(arr, i, i+1);
                }
            }
            n--;
            /* n=n=arr.length-1-1时(即第一次),for循环结束后获取到最小的一个数,排在最前面 */
            /*        1, 12, 4, 6, 9, 14, 11, 8, 3, 16,   */
            for(int i = n; i > m; i--){
                if(arr[i] < arr[i-1]){
                    swap(arr,i,i-1);
                }
            }
            m++;
        }
    }

    /*
        交换角标为x,y在数组的位置
     */
    private static void swap(int[] arr, int x, int y){
        int temp;
        temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }
}

执行结果为:

1, 3, 4, 6, 8, 9, 11, 12, 14, 16, 


对于鸡尾酒排序,算法的时间复杂度与空间复杂度显然与冒泡排序相同。
不同的是排序的交换次数。某些情况下鸡尾酒排序比普通冒泡排序的交换次数少。比如{2,3,4,1},鸡尾酒排序只需交换2次,而冒泡排序需要三次。
总体上,鸡尾酒排序可以获得比冒泡排序稍好的性能。但是完全逆序时,鸡尾酒排序与冒泡排序的效率都非常差。

猜你喜欢

转载自blog.csdn.net/qq_33404395/article/details/80330330