理论基础 —— 排序 —— 鸡尾酒排序
【概述】
雞尾酒排序也稱定向冒泡排序,是一種穩(wěn)定的排序方法,其是原始冒泡排序的改進(jìn),也是交換排序的一種。
定向冒泡排序與冒泡排序的不同在于其從低到高比較,然后再?gòu)母叩降捅容^,如此循環(huán)往復(fù),直到序列有序,而冒泡排序僅是從低到高的去比較序列中的每個(gè)元素。
其實(shí)現(xiàn)借助兩個(gè)指針來(lái)完成,一個(gè)作為頭指針,負(fù)責(zé)從前向后掃描,一個(gè)作為尾指針,負(fù)責(zé)從后向前掃描,外層循環(huán)依靠指針控制數(shù)組左右邊界,內(nèi)層循環(huán)分別控制前后邊界的排序。
【過程】
初始關(guān)鍵字: ?『?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
結(jié)果: ??『??1,2,3,4,5,6,7,8 ?』
?????
? ? ? ? ? ? ? ? ? ? ? ?宏觀過程
【時(shí)空復(fù)雜度分析】
最好的情況,是要排序的表本身就是有序的,只需要進(jìn)行 n-1 次比較,沒有數(shù)據(jù)交換,因此最優(yōu)時(shí)間復(fù)雜度為 O(n)
最壞的情況,是要排序的表是逆序的情況,因此供需比較 n(n-1)/2 次,并作等數(shù)量級(jí)的記錄移動(dòng),因此最壞時(shí)間復(fù)雜度為 O(n^2)
而在平均情況下,時(shí)間復(fù)雜度與最壞時(shí)間復(fù)雜度同數(shù)量級(jí),即平均時(shí)間復(fù)雜度為 O(n^2)
此外,定向冒泡排序僅需一個(gè)輔助空間,用于作記錄交換的暫存單元,即空間復(fù)雜度為 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++;} }總結(jié)
以上是生活随笔為你收集整理的理论基础 —— 排序 —— 鸡尾酒排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小玉在游泳(洛谷-P1423)
- 下一篇: 信息学奥赛C++语言: 趣味整数3(回文