雞尾酒排序是一種交換排序,可以作爲冒泡排序的改進算法。
其思路是:
從左到右比較移動一輪後,從右到左再移動一輪……
移動的形式像是“鐘擺”,可以將輪數減少一半。
雞尾酒排序自然也可以對有序區進行優化,但是這裏給出的代碼不包含該優化。
public static void sort(int[] array) {
int tmp = 0;
for (int i = 0; i < array.length/2; i++) {
//有序標記,每一輪初始值都是true
boolean isSorted = true;
//奇數輪,從左向右比較和交換
for (int j = i; j < array.length-i-1; j++) {
if (array[j] > array[j+1]) {
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
//所有元素交換,所以不是有序的,標記變爲false
isSorted = false;
}
}
if (isSorted) {
break;
}
//在偶數輪之前,將isSorted重新標記爲true
isSorted = true;
//偶數輪,從右向左比較和交換
for (int j = array.length-i-1; j > i; j--) {
if (array[j] < array[j-1]) {
tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
//因爲有元素進行交換,所以不是有序的,標記變爲false
isSorted = false;
}
}
if (isSorted) {
break;
}
}
}
雞尾酒排序的優缺點:
- 優點:在特定條件,減少排序回合數。
- 缺點:代碼量幾乎增加一倍。
在大部分元素已經有序的情況下,雞尾酒排序很合適。