數據結構與算法系列——排序(8.2)_雞尾酒排序

1. 工做原理(定義)

  核心思想:雞尾酒排序是冒泡排序的一種改進和變型 ,又稱「雙向冒泡排序」,雞尾酒排序是從低到高而後從高到低來回排序(選出最大和最小項),比冒泡排序的效率稍微好一點,緣由是冒泡排序只從一個方向進行比對(由低到高),每次循環只移動一個項目。 算法

2. 算法步驟

1. 先對數組從左到右進行冒泡排序(升序),則最大的元素去到最右端 
2. 再對數組從右到左進行冒泡排序(降序),則最小的元素去到最左端 
3. 循環一、2步操做,依次改變冒泡的方向,並不斷縮小未排序元素的範圍,直到最後一個元素結束數組

  

4. 性能分析

  雞尾酒排序是冒泡排序的一種改進,倒並未有本質的改變,與冒泡排序的時間複雜度和空間複雜度相近,總體的性能都比較差。函數

1. 時間複雜度

  (1)順序排列時,雞尾酒排序時間複雜度爲O(n); 
  (2)逆序排序時,雞尾酒排序時間複雜度爲O(n^2); 
  (3)當原始序列雜亂無序時,平均時間複雜度爲O(n^2)。性能

2. 空間複雜度

  雞尾酒排序排序過程當中,Swap函數須要一個臨時變量temp進行兩兩交換,所須要的額外空間爲1,所以空間複雜度爲O(1)。spa

3. 算法穩定性 

  雞尾酒排序是一種穩定的排序算法。.net

5. 具體代碼

public class CockTailSort{
    public static void main(String[] args) {
        int[] arr = {8,7,6,5,4,3,2,1};
        cockTailSort(arr);
    }

    public static void cockTailSort(int[] arr) {
        boolean isSorted=false;
        int length = arr.length;
        //雙向同時進行
        for(int i=0;i<length/2;i++) {
            isSorted=false;
            //升序排列
            for(int j=i;j<length-i-1;j++) {
                if(arr[j]>arr[j+1]) {
                    swap(arr, j, j + 1);
                    isSorted=true;
                }
            }
            //降序排列
            for(int j=length-i-1;j>i;j--) {
                if(arr[j] < arr[j-1]) {
                     swap(arr, j, j - 1);
                    isSorted=true;
                }
            }

            if(isSorted==false) {
                break;
            }
        }
    }
    //交換
    private static void swap(int[] arr, int a, int b) {
        int tmp = arr[a];
        arr[a] = arr[b];
        arr[b] = tmp;
    }
}

6. 參考網址

  1. 排序算法系列之雞尾酒排序code

相關文章
相關標籤/搜索