鸡尾酒排序
鸡尾酒排序是冒泡排序的一种变形。先找到最小的数字,放在第一位,再找到最大的数字放在最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。
鸡尾酒排序的时间复杂度为 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次,而冒泡排序需要三次。
总体上,鸡尾酒排序可以获得比冒泡排序稍好的性能。但是完全逆序时,鸡尾酒排序与冒泡排序的效率都非常差。