1. 程式人生 > >排序(二)——氣泡排序及其改進

排序(二)——氣泡排序及其改進

 氣泡排序(Bubble Sort)

氣泡排序(Bubble Sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

氣泡排序演算法的步驟:

1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

3.針對所有的元素重複以上的步驟,除了最後一個。

4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

#include<stdio.h>

void BubbleSort(int arr[], int size)
{
	int i = size;
	int j = 0;
	int temp = 0;
	while (i)
	{
		for (j = 0; j < i - 1; ++j)
		{
			if (arr[j]>arr[j + 1])
			{
				temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
		}
		i--;
	}
}
int main(int arc, char* const argv[])
{
	int arr[] = { 1, 3, 5, 7, 8, 4, 9, 12, 3, 0 };
	BubbleSort(arr, 10);
	for (int i = 0; i < 10; ++i)
	{
		printf("%4d", arr[i]);
	}
	system("pause");
	return 0;
}

     氣泡排序演算法最壞情況和平均複雜度是O(n²),甚至連插入排序(O(n²)演算法複雜度)效率都比氣泡排序演算法更好,唯一的優勢在於基於它的改進演算法——快速排序演算法。

氣泡排序演算法改進

  記住最後一次交換髮生位置index的氣泡排序

     1.設定一標誌性變數index, 用於記錄每趟排序中最後一次進行交換的位置。由於index位置之後的記錄均已交換到位, 故在進行下一趟排序時只要掃描到pos位置即可。

#include<stdio.h>

void BubbleSort(int arr[], int size)
{
	int i = size;
	int j = 0;
	int temp = 0;
	int index = 0;
	while (i)
	{
		for (j = 0; j < i - 1; ++j)
		{
			if (arr[j]>arr[j + 1])
			{
				temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
		}
		i--;
	}
}
int main(int arc, char* const argv[])
{
	int arr[] = { 1, 3, 5, 7, 8, 4, 9, 12, 3, 0 };
	BubbleSort(arr, 10);
	for (int i = 0; i < 10; ++i)
	{
		printf("%4d", arr[i]);
	}
	system("pause");
	return 0;
}

     2.如果某一趟沒有資料交換,則表示已經排好序,就可以提前終止迴圈。

(ps:因為C中不支援bool型別,所以下面程式碼改成了C++型別,當然如果想在C語言中判斷真假話,可以自己定義下:

             typedef char bool; 
     #define TRUE 1 
     #define FALSE 0 )。

#include<stdio.h>
#include<iostream>
using namespace std;

void BubbleSort(int arr[], int size)
{
	int i = size;
	int j = 0;
	int temp = 0;
	int index = 0;
	bool isEXchange = true;
	while (i)
	{
		for (j = 0; j < i - 1; ++j)
		{
			if (arr[j]>arr[j + 1])
			{
				temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
				index = j;
				isEXchange == true;
			}
		}
		i--;
	}
}
int main(int arc, char* const argv[])
{
	int arr[] = { 1, 3, 5, 7, 8, 4, 9, 12, 3, 0 };
	BubbleSort(arr, 10);
	for (int i = 0; i < 10; ++i)
	{
		printf("%4d", arr[i]);
	}
	system("pause");
	return 0;