雞尾酒排序算法是一種定向的冒泡排序算法,由于其來回折騰,因此又叫雞尾酒攪拌排序、來回排序或者是漣漪排序、快樂小時排序。這個算法與冒泡排序的不同之處在于排序時是以雙向在序列中進行排序的。
算法思想:
- 采用冒泡排序的思路,第一躺沿正方向找到最大值;
- 第二趟,從n-1個元素位置,沿反方向找到最小值
- 第三趟,從第2個元素位置,沿正方向找到第二大的值,冒泡到n-1
- 重復上面的操作,直到排序完成
代碼實現
void cocktail_sort(int arr[], int len) {
int i, left = 0, right = len;
int temp;
while (left < right) {
for (i = left; i < right; i++)
if (arr[i] > arr[i + 1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
right--;
for (i = right; i > left; i--)
if (arr[i - 1] > arr[i]) {
temp = arr[i];
arr[i] = arr[i - 1];
arr[i - 1] = temp;
}
left++;
}
}
算法分析
- 最優的情況下,復雜度為O(n),當然,也是要引入標志位
- 最差的情況下,復雜度為O(n^2),當然,會比冒泡排序算法性能好一點
- 平均復雜度為O(n^2)
- 相比于冒泡排序,不同的地方在于從低到高,然后從高到低,因此可以得到比冒泡排序稍微好一些的性能。
可以這么總結:相對于冒泡排序,采用雞尾酒排序,性能至少不會變壞,大多數情況下能獲得更好的性能。
過程舉例
cocktail_sort_example.png
動態過程
Sorting_shaker_sort_anim.gif