1. 程式人生 > >氣泡排序及其改進演算法

氣泡排序及其改進演算法

將陣列a[10] = {7,2,9,4,1,3,8,6,5,0}從小到大排序並列印結果

列印函式:

void printA(int *a,int len)
{
	int i;
	for(i = 0; i < len; i++)
	{
		printf("%4d",a[i]);
	}
	printf("\n");
}

交換兩個元素的位置:將陣列首地址及要交換的元素下標作為引數傳入
void Swap(int *a,int i,int j)
{
	int tmp = a[i];
	a[i] = a[j];
	a[j] = tmp;
}
氣泡排序:

氣泡排序外層迴圈控制輪數,每次從前往後找出一個最大的數沉底

void bubble(int *a,int len)
{
	int i,j;
	for(i = 0; i < len-1; i++)
	{
		for(j = 0; j < len-1-i; j++)
		{
			if(a[j] > a[j+1])
			{
				Swap(a,j,j+1);
			}
		}
	}
}
main呼叫
int main()
{
	int a[10] = {7,2,9,4,1,3,8,6,5,0};
	int len = sizeof(a)/sizeof(a[0]);
	
	bubble(a,len);
	
	printA(a,len);
	
	return 0;
}

下面為氣泡排序的改進演算法:雞尾酒排序

雞尾酒排序在氣泡排序基礎上加入一個迴圈,在從前往後找到一個最大數沉底後從後往前找一個最小數浮頂

void cocktail(int *a,int len)
{
	int i;
	int left = 0;
	int right = len-1;
	while(left < right)                      //左右邊界控制迴圈次數,當左右邊界相遇結束迴圈
	{
		for(i = left; i < right; i++)    //從左往右,找出一個最大數沉底
		{
			if(a[i] > a[i+1])
			{
				Swap(a,i,i+1);
			}
		}
		right--;                         //右邊界左移一個
		
		for(i = right; i > left; i--)    //從右往左,找出一個最小數浮頂
		{
			if(a[i-1] > a[i])
			{
				Swap(a,i-1,i);
			}
		}
		left++;                          //左邊界右移一個
	}
}