核心思想:雞尾酒排序是冒泡排序的一種改進和變型 ,又稱「雙向冒泡排序」,雞尾酒排序是從低到高而後從高到低來回排序(選出最大和最小項),比冒泡排序的效率稍微好一點,緣由是冒泡排序只從一個方向進行比對(由低到高),每次循環只移動一個項目。 算法
1. 先對數組從左到右進行冒泡排序(升序),則最大的元素去到最右端
2. 再對數組從右到左進行冒泡排序(降序),則最小的元素去到最左端
3. 循環一、2步操做,依次改變冒泡的方向,並不斷縮小未排序元素的範圍,直到最後一個元素結束數組
雞尾酒排序是冒泡排序的一種改進,倒並未有本質的改變,與冒泡排序的時間複雜度和空間複雜度相近,總體的性能都比較差。函數
(1)順序排列時,雞尾酒排序時間複雜度爲O(n);
(2)逆序排序時,雞尾酒排序時間複雜度爲O(n^2);
(3)當原始序列雜亂無序時,平均時間複雜度爲O(n^2)。性能
雞尾酒排序排序過程當中,Swap函數須要一個臨時變量temp進行兩兩交換,所須要的額外空間爲1,所以空間複雜度爲O(1)。spa
雞尾酒排序是一種穩定的排序算法。.net
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; } }
排序算法系列之雞尾酒排序code