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

 冒泡排序(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;




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章