C語言] 選擇排序之雞尾酒排序的特性及實現
算法
一、算法特性測試
雞尾酒排序又稱定向冒泡排序法,是一種穩定的選擇排序方法,排序效果稍優於冒泡排序。spa
其時間複雜度最好狀況爲O(n)、最差與平均狀況爲O(n²),空間複雜度爲O(1)。3d
二、算法思路:code
以升序排列爲例,先設置兩個臨時變量index_nmin與index_nmax分別存儲最小值與最大值的下標,初始通常假設index_nmin與index_nmax均爲0,再將選定值與其以後的數據依次比較:當比較值比選擇值小/大時,index_nmin/index_nmax更新爲比較值的下標,以後繼續檢索,直到無序序列部分結束爲止;一輪檢索事後將arr[index_nmin]與無序序列隊首、arr[index_nmax]與無序序列隊尾交換位置,通過len/2次循環即可以將全部數據排列有序。blog
這裏須要注意的是,在最小/最大值與相應位置交換以後須要多一道覈實流程:在最小/最大值交換完畢後,檢查最大/最小值的下標是不是i-1/len-i,如果,則要將最大/最小值與下標i-1/len-i交換;若不是,則繼續正常交換。其目的是避免最大最小值最終位置錯亂。排序
三、實現代碼io
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 }
四、測試結果class