鸡尾酒排序,也叫双向冒泡排序,是冒泡排序的一个变形。
使用鸡尾酒排序为一列数字进行排序的过程可以通过右图形象的展示出来:
数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。
冒泡排序每次都从低到高,一个方向排,鸡尾酒排序,从低到高,然后从高到低的排序,会得到比冒泡排序更好的性能。在乱序数列中,冒泡和鸡尾酒排序效率都不理想。
由于鸡尾酒排序是双向的,所以最多需要原来数组的1/2次就可以了,但有时候不用非要比较到最后,就已经排好序了,后面的排序过程可以省略,所以引入一个变量记录是否还有数字交换,如果没有就提前退出。
也可以每次都将排序的规模减小,因为每个排序完,首尾都已经排序完成了。
static void sort(int[] numbers){ int temp; int m=0,n=numbers.length-1; while(m<n){ for(int i=m; i<n;i++){ if(numbers[i]>numbers[i+1]){ //交换数组中两个数字的位置 temp=numbers[i]; numbers[i]=numbers[i+1]; numbers[i+1]=temp; } } n--; for(int i=n; i>m;i--){ if(numbers[i]<numbers[i-1]){ //交换数组中两个数字的位置 temp=numbers[i]; numbers[i]=numbers[i-1]; numbers[i-1]=temp; } } m++; } } }