1. 程式人生 > >【排序演算法1】雙向氣泡排序(雞尾酒排序)

【排序演算法1】雙向氣泡排序(雞尾酒排序)

總結一下最近學習的幾個排序演算法
一開始找的是氣泡排序,在網上找資料時發現了這個雞尾酒排序,比較有意思。

雞尾酒排序就是雙向氣泡排序
先找到最小的數字,把他放到第一位,然後找到最大的數字,放到最後一位。
然後再找第二小的數字放到第二位,再找第二大的數字放到倒數第二位,以此類推,直到完成排序

#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)