鸡尾酒排序:
作为冒泡排序的一种变式,鸡尾酒排序首先从第一个元素的位置开始,到最后一个元素的位置结束,两两元素进行比较,将最大的元素置换到最后一位;再从倒数第二位元素向第一位元素比较,此次找到最小的元素,置换到队列的第一位;再继续从第二位元素开始比较,到倒数第三位元素结束……以此类推,直到比较到仅剩队列最中间的一位或两位元素结束。
代码如下:
public static void cocktailSort(int[] arr) {
int start = 0;
int end = arr.length - 1;
while(start < end){
for(int i = start;i < end;i++){
if(arr[i] > arr[i + 1]){
swap(arr,i,i + 1);
}
}
end--;
for(int i = end;i > start;i--){
if(arr[i] < arr[i - 1]){
swap(arr,i,i - 1);
}
}
start++;
}
}
双指针法:
在鸡尾酒排序中,我们利用双指针法来确定每一趟比较的开始位置和结束位置。
设置一个指向第一个元素的头指针start,一个指向最后一个元素的尾指针end(注意,这里的数组下标被抽象为指针)。经历第一趟比较后,需要把尾指针end从原先的指向最后一个元素向前挪一位,指向倒数第二个元素,每经历一趟比较,都需要挪动头指针或尾指针的位置,向最中间靠近(找最小值之后挪动头指针,找最大值挪动尾指针)。建立一个while循环,将其条件设置为(start < end)或(start != end),来检验头尾指针是否相遇,如果相遇,证明排序完毕。
此方法的排序速度依赖于数据的特殊排列形式。
如有错误或更好的改进意见,欢迎批评指正!