1. 程式人生 > >小甲魚 排序演算法 氣泡排序

小甲魚 排序演算法 氣泡排序

小甲魚 排序演算法 氣泡排序

 

氣泡排序

基本思想:兩兩相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止

(PS  反序:大在前,小在後)

 

下面的程式碼不是真正意義的氣泡排序(因為比較的不是相鄰)

//BubbleSort氣泡排序

#include <stdio.h>

void BubbleSort(int k[], int n)
{
	int i, j, temp;
	
	//為什麼n-1,因為排序到最後一個,最後一個已經是最大的,不需要再排序 
	for (i = 0; i < n-1; i++)
	{
		//j=i+1:下一個元素
		for (j = i+1; j < n; j++)
		{
			//從小到大排序 
			if (k[i] > k[j])
			{
				temp = k[j];
				k[j] = k[i];
				k[i] = temp;
			}
		}
	}
}

int main(void)
{
	int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};
	
	BubbleSort(a, 10);
	
	printf("排序後的結果是:");
	for (i = 0; i < 10; i++)
	{
		printf("%d", a[i]);
	}
	printf("\n\n");
	
	return 0;
}

 

氣泡排序的要點

1、兩兩注意是相鄰的兩個元素的意思。

2、如果有n個元素需要比較n-1次,每一輪減少1次比較。

3、既然叫氣泡排序,那就是從下往上兩兩比較,所以看上去就跟泡泡往上冒一樣。

 

真正意義的冒泡演算法

陣列從最後面進行比較,每一次排序確定最小的排在前面

//BubbleSort氣泡排序

#include <stdio.h>

void BubbleSort(int k[], int n)
{
	int i, j, temp, count1=0, count2=0;
	
	for (i = 0; i < n-1; i++)
	{
		//為什麼是n-1?
		//每一次迴圈後確定的元素不在參與比較 
		//第一次確定第一大,第二次確定第二大 
		for (j = n-1; j > i; j--)
		{
			count1++;
			//從小到大排序
			if (k[j-1] > k[j])
			{
				count2++;
				temp = k[j-1];
				k[j-1] = k[j];
				k[j] = temp;
			}		
		}
	}
	
	printf("總共進行了%d次比較,進行了%d次移動!\n", count1, count2);
}

int main(void)
{
	int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};
	
	BubbleSort(a, 10);
	
	printf("排序後的結果是:");
	for (i = 0; i < 10; i++)
	{
		printf("%d", a[i]);
	}
	printf("\n\n");
	
	return 0;
}

 

 

優化氣泡排序演算法

//BubbleSort氣泡排序

#include <stdio.h>

void BubbleSort(int k[], int n)
{
	int i, j, temp, count1=0, count2=0, flag;
	
	flag = 1;
	for (i = 0; i < n-1 && flag; i++)
	{
		//為什麼是n-1?
		//每一次迴圈後確定的元素不在參與比較 
		//第一次確定第一大,第二次確定第二大 
		for (j = n-1; j > i; j--)
		{
			count1++;
			flag = 0;//沒有執行移動 
			//從小到大排序
			if (k[j-1] > k[j])
			{
				count2++;
				temp = k[j-1];
				k[j-1] = k[j];
				k[j] = temp;
				flag = 1;
			}		
		}
	}
	
	printf("總共進行了%d次比較,進行了%d次移動!\n", count1, count2);
}

int main(void)
{
	int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};
	
	BubbleSort(a, 10);
	
	printf("排序後的結果是:");
	for (i = 0; i < 10; i++)
	{
		printf("%d", a[i]);
	}
	printf("\n\n");
	
	return 0;
}