C语言] 选择排序之鸡尾酒排序的特性及实现
1、算法特性
鸡尾酒排序又称定向冒泡排序法,是一种稳定的选择排序方法,排序效果稍优于冒泡排序。
其时间复杂度最好情况为O(n)、最差与平均情况为O(n²),空间复杂度为O(1)。
2、算法思路:
以升序排列为例,先设置两个临时变量index_nmin与index_nmax分别存储最小值与最大值的下标,初始一般假设index_nmin与index_nmax均为0,再将选定值与其之后的数据依次比较:当比较值比选择值小/大时,index_nmin/index_nmax更新为比较值的下标,之后继续检索,直到无序序列部分结束为止;一轮检索过后将arr[index_nmin]与无序序列队首、arr[index_nmax]与无序序列队尾交换位置,经过len/2次循环便可以将所有数据排列有序。
这里需要注意的是,在最小/最大值与相应位置交换之后需要多一道核实流程:在最小/最大值交换完毕后,检查最大/最小值的下标是否是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(" "); 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、测试结果