理论基础 —— 排序 —— 鸡尾酒排序
【概述】
雞尾酒排序也稱定向冒泡排序,是一種穩定的排序方法,其是原始冒泡排序的改進,也是交換排序的一種。
定向冒泡排序與冒泡排序的不同在于其從低到高比較,然后再從高到低比較,如此循環往復,直到序列有序,而冒泡排序僅是從低到高的去比較序列中的每個元素。
其實現借助兩個指針來完成,一個作為頭指針,負責從前向后掃描,一個作為尾指針,負責從后向前掃描,外層循環依靠指針控制數組左右邊界,內層循環分別控制前后邊界的排序。
【過程】
初始關鍵字: ?『?6,5,3,1,8,7,2,4 ?』
第一趟排序: ?『?6,5,3,1,8,7,2,4 ?』
?? ? ? ? ? ? ? ? ? ? ? ?5,『?6,3,1,8,7,2,4』
?? ? ? ? ? ? ? ? ? ? ? ?5,3,『?6,1,8,7,2,4』
?? ? ? ? ? ? ? ? ? ? ? ?5,3,1,『?6,8,7,2,4』
?? ? ? ? ? ? ? ? ? ? ? ?5,3,1,6,『?8,7,2,4』
?? ? ? ? ? ? ? ? ? ? ? ?5,3,1,6,7,『?8,2,4』
?? ? ? ? ? ? ? ? ? ? ? ?5,3,1,6,7,2,『?8,4』
?? ? ? ? ? ? ? ? ? ? ? ?5,3,1,6,7,2,4,『?8』
第二趟排序:『?5,3,1,6,7,2,4』,8
?? ? ? ? ? ? ? ? ? ? ?『 5,3,1,6,7,2』,4,8
?? ? ? ? ? ? ? ? ? ? ?『 5,3,1,6,2』,7,4,8
?? ? ? ? ? ? ? ? ? ? ?『 5,3,1,2』,6,7,4,8
?? ? ? ? ? ? ? ? ? ? ?『 5,3,1』,2,6,7,4,8
?? ? ? ? ? ? ? ? ? ? ?『 5,1』,2,3,6,7,4,8
?? ? ? ? ? ? ? ? ? ? ?『 1』,2,5,3,6,7,4,8
第三趟排序: 1,『2,5,3,6,7,4』,8
???????????????????????1,2,『5,3,6,7,4』,8
???????????????????????1,2,3,『5,6,7,4』,8
???????????????????????1,2,3,5,『6,7,4』,8
???????????????????????1,2,3,5,6,『7,4』,8
???????????????????????1,2,3,5,6,4,『7』,8
第四趟排序: 1,『2,3,5,6,4』,7,8
???????????????????????1,『2,3,5,4』,6,7,8
???????????????????????1,『2,3,4』,5,6,7,8
???????????????????????1,『2,3』,4,5,6,7,8
???????????????????????1,『2』,3,4,5,6,7,8
第五趟排序: 1,2,『3,4,5,6』,7,8
? ? ? ? ? ? ? ? ? ? ? ?1,2,3,『4,5,6』,7,8
? ? ? ? ? ? ? ? ? ? ? ?1,2,3,4,『5,6』,7,8
? ? ? ? ? ? ? ? ? ? ? ?1,2,3,4,5,『6』,7,8
第六趟排序: 1,2,『3,4,5』,6,7,8
? ? ? ? ? ? ? ? ? ? ? ?1,2,『3,4』,5,6,7,8
? ? ? ? ? ? ? ? ? ? ? ?1,2,『3』,4,5,6,7,8
第七趟排序:??1,2,3,『4,5』,6,7,8
結果: ??『??1,2,3,4,5,6,7,8 ?』
?????
? ? ? ? ? ? ? ? ? ? ? ?宏觀過程
【時空復雜度分析】
最好的情況,是要排序的表本身就是有序的,只需要進行 n-1 次比較,沒有數據交換,因此最優時間復雜度為 O(n)
最壞的情況,是要排序的表是逆序的情況,因此供需比較 n(n-1)/2 次,并作等數量級的記錄移動,因此最壞時間復雜度為 O(n^2)
而在平均情況下,時間復雜度與最壞時間復雜度同數量級,即平均時間復雜度為 O(n^2)
此外,定向冒泡排序僅需一個輔助空間,用于作記錄交換的暫存單元,即空間復雜度為 O(1)
【源程序】
void cocktailSort(int a[],int n){int left=1,right=n;while(left<right){/*前半輪,將最大元素放到后面*/for(int i=left;i<right;i++)if(a[i]>a[i+1])swap(a[i],a[i+1]);right--;/*后半輪,將最小元素放到前面*/for(int i=right;i>left;i--)if(a[i-1]>a[i])swap(a[i],a[i-1]);left++;} }總結
以上是生活随笔為你收集整理的理论基础 —— 排序 —— 鸡尾酒排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小玉在游泳(洛谷-P1423)
- 下一篇: 信息学奥赛C++语言: 趣味整数3(回文