[C语言] 选择排序之鸡尾酒排序的特性及实现

[C语言] 选择排序之鸡尾酒排序的特性及实现

 

1、算法特性

  鸡尾酒排序又称双向冒泡排序法,是一种稳定的选择排序方法,其时间复杂度最好情况为O(n)、最差为O(n²)、平均为O(n²),空间复杂度为O(1)。

 

2、算法思路:

  以升序排列为例,先设置两个临时变量index_nmin与index_nmax分别存储最小值与最大值的下标,初始值一般假设index_nmin与index_nmax均为0,再将它与它之后的数据从前往后依次进行比较。当比较值比选择值小/大时,index_nmin/index_nmax更新为比较值的下标,arr[j]继续向后检索,直到len-i为止;一轮循环过后将arr[index_nmin]与arr[i-1]、arr[index_nmax]与arr[len-i]交换位置,经过不断循环便可以将所有数据排列有序。

  这里需要注意的是,在最小/最大值与相应位置交换之后需要多一道核实流程:在最小/最大值交换完毕后,检查最大/最小值的下标是否是i-1/len-i,若是,则要将最大/最小值与下标i-1/len-i交换;若不是,则继续正常交换。其目的是避免最大最小值最终位置错乱。

 

3、实现代码

 1 #include <stdio.h>
 2 
 3 // 鸡尾酒排序:选择排序一种变化形式
 4 void cooktail_sort(int arr[],int len)
 5 {
 6     for(int i=1; i<=len/2; i++)
 7     {
 8         int max = i-1;
 9         int min = i-1;
10         for(int j=i; j<=len-i; j++)
11         {
12             if(arr[j] > arr[max])
13             {
14                 max = j;
15             }
16             if(arr[j] < arr[min])
17             {
18                 min = j;    
19             }
20         }
21         if(max != len-i)
22         {
23             int tmp = arr[len-i];
24             arr[len-i] = arr[max];
25             arr[max] = tmp;
26         }
27         if(min == len-i) // 最小值的位置正好在本来应该存储最大值位置 经过上面交换之后最小值放到了max位置上
28         {
29             int tmp = arr[i-1];
30             arr[i-1] = arr[max];
31             arr[max] = tmp;
32         }
33         else if(min != i-1)
34         {
35             int tmp = arr[i-1];
36             arr[i-1] = arr[min];
37             arr[min] = tmp;
38         }
39     }    
40 }
41 
42 void travel(int arr[],int len)
43 {
44     for(int i=0;i<len;i++)
45     {
46         printf("%d ",arr[i]);    
47     }    
48     printf("\n");
49 }
50 
51 int main()
52 {
53     int arr[] = {53,82,9,233,43,14,55,9,4,67};
54     int len = sizeof(arr)/sizeof(arr[0]);
55 
56     travel(arr,len);
57     select_sort(arr,len);
58     travel(arr,len);
59 
60 /*    travel(arr,len);
61     cooktail_sort(arr,len);
62     travel(arr,len);*/
63 
64     return 0;
65 }

 

4、测试结果

猜你喜欢

转载自www.cnblogs.com/usingnamespace-caoliu/p/9428134.html