C 鸡尾酒排序
鸡尾酒排序描述
鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也可以视作选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形。此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
示例代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 void swap(int *x, int *y)
4 {
5 int t=*x; *x=*y; *y=t;
6 }
7
8 void cocktail_sort(int arr[], const int length)
9 {
10 int flag = 1;
11 int temp;
12 int i, bottom = 0;
13 int top = length - 1;
14
15 while(bottom < top) {
16 for(i = bottom; i < top; i ++)
17 if(arr[i] > arr[i + 1])
18 swap(&arr[i], &arr[i + 1]);
19
20 top --;
21 for(i = top; i >= bottom; i --)
22 if(arr[i + 1] < arr[i])
23 swap(&arr[i + 1], &arr[i]);
24 bottom ++;
25 }
26 }
27
28 int main()
29 {
30 int number[] = {5,3,8,4,1,7,9,2,0,6};
31 cocktail_sort(number, 10);
32 int i;
33 for(i = 0; i < 10; i ++)
34 printf("%d\n", number[i]);
35 }
输出结果
0
1
2
3
4
5
6
7
8
9
与冒泡排序不同的地方
鸡尾酒排序等于是冒泡排序的轻微变形。不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能,原因是冒泡排序只从一个方向进行比对(由低到高),每次循环只移动一个项目。
以序列(2,3,4,5,1)为例,鸡尾酒排序只需要访问一次序列就可以完成排序,但如果使用冒泡排序则需要四次。
复杂度
鸡尾酒排序最糟或是平均所花费的次数都是O(n2),但如果序列在一开始已经大部分排序过的话,会接近O(n)。