雞尾酒排序,也就是定向冒泡排序, 雞尾酒攪拌排序, 攪拌排序 (也可以視作選擇排序的一種變形), 漣漪排序, 來回排序 or 快樂小時排序, 是冒泡排序的一種變形。此算法與冒泡排序的不同處在於排序時是以雙向在序列中進行排序。
#include<stdio.h> #include<string.h> #include<math.h> #include<ctype.h> #include<stdbool.h> void swap(int *a, int *b) //交換兩元素的值 { int t; t=*a; *a=*b; *b=t; } void printArray(int a[], int count) //打印數組元素 { int i; for(i=0; i<count; i++) printf("%d ",a[i]); printf("\n"); } void cocktail_sort(int a[], int size){ //數組中的第一個數爲0索引 int i,bottom = 0; int top = size - 1; bool swapped = true; while(swapped) //假如沒有元素交換,則數組有序 { swapped = false; for(i = bottom; i < top; i++) { if(a[i] > a[i + 1]) //判斷兩個元素是否正確的順序 { swap(&a[i], &a[i + 1]); //讓兩個元素交換順序 swapped = true; } } // 將未排序部分的最大元素交換到頂端 top = top - 1; for(i = top; i > bottom; i--) { if(a[i] < a[i - 1]) { swap(&a[i], &a[i - 1]); swapped = true; } } //將未排序部分的最小元素交換到底端 bottom = bottom + 1; } } int main(void) { int a[]={3, 5, 4, 6, 9, 7, 8, 0, 1}; int n=sizeof(a)/sizeof(*a); printArray(a,n); cocktail_sort(a,n); printArray(a,n); return 0; }