【排序演算法1】雙向氣泡排序(雞尾酒排序)
阿新 • • 發佈:2018-12-02
總結一下最近學習的幾個排序演算法
一開始找的是氣泡排序,在網上找資料時發現了這個雞尾酒排序,比較有意思。
雞尾酒排序就是雙向氣泡排序
先找到最小的數字,把他放到第一位,然後找到最大的數字,放到最後一位。
然後再找第二小的數字放到第二位,再找第二大的數字放到倒數第二位,以此類推,直到完成排序
#include <stdio.h> #include <Windows.h> void Swap(int *,int *); void print(int[],int); void cocktail_sort(int a[],int n) { int bottom = 0,top = n -1; //元素下標 int swapped = 1; int bound = 0; //優化迴圈次數,記錄已經排序的邊界,減少迴圈次數 while(swapped) { swapped = false; //進來就設定成false,如果一遍一下都沒有交換就證明已經排序完全 //從前往後找 for( int i = bottom; i < top ; ++i ) { if( a[i + 1] < a[i] ) { Swap(&a[i + 1],&a[i]); //如果前一個數比後一個數大,就交換2個元素 swapped = true; bound = i; } } top = bound; //從後往前找 for(int i = top ; i > bottom ; --i) { if( a[i] < a[i - 1] ) //如果前一個數比後一個數大,就交換2個元素 { Swap(&a[i],&a[i - 1]); swapped = true; bound = i; } } bottom = bound; } } void Swap(int *a,int *b) { int temp = *a; *a = *b; *b = temp; } void print(int a[],int n) { for(int i = 0 ; i < n ; ++i) { printf("%d ",a[i]); } printf("\n"); } int main() { int a[10] = {9,8,7,6,5,4,3,2,1,0}; cocktail_sort(a,10); print(a,10); system("pause"); return 0; }
上面的程式碼在本質上還是一個氣泡排序,所以時間複雜度為O(n2)