排序算法之冒泡排序(C語言)

一、原理講解

所謂排序,就是將一串無序數據,按照其中某個或某些關鍵的大小,遞增或遞減排列起來的操作,排序算法,就是如何使得記錄按照要求排列的方法。

下面對冒泡排序進行詳解。這裏我們先對冒泡二字進行初步的說明。冒泡指的就是水下的氣泡,從水底向上冒的過程,這氣泡在上升的過程,氣泡在壓力的作用下,逐漸表大。如下圖所示:

冒泡算法實現過程就如這冒泡的過程,算法核心是相鄰的兩個數進行比較,將大的/小的向後移。

假定有一個數組arr[10] = {80, -20, 36, 1, 6, 8, 65, 4, 33, 16};

上圖中顯示的每輪排序之後得到的結果,其中第0輪是原始數據,下面以第一輪爲例進行詳細講解:

記住冒泡排序的算法核心是相鄰的兩個數,兩兩比較,大的/小的向後移,並且氣泡是從水底往上冒的,所以我們按照以下順序必須排序:

第一次:arr[0]與arr[1]進行比較,arr[0] > arr[1]  所以arr[0]的數據和arr[1]的數據進行交換,arr[0] = -20  arr[1] = 80

第二次:arr[1]與arr[2]進行比較,arr[1] > arr[2]  所以arr[1]的數據和arr[2]的數據進行交換,arr[1] = 36  arr[2] = 80

第三次:arr[2]與arr[3]進行比較,arr[2] > arr[3]  所以arr[2]的數據和arr[3]的數據進行交換,arr[2] = 1  arr[3] = 80

第四次:arr[3]與arr[4]進行比較,arr[3] > arr[4]  所以arr[3]的數據和arr[4]的數據進行交換,arr[3] = 6  arr[4] = 80

第五次:arr[4]與arr[5]進行比較,arr[4] > arr[5]  所以arr[4]的數據和arr[5]的數據進行交換,arr[4] = 8  arr[5] = 80

第六次:arr[5]與arr[6]進行比較,arr[5] > arr[6]  所以arr[5]的數據和arr[6]的數據進行交換,arr[5] = 65  arr[6] = 80

第七次:arr[6]與arr[7]進行比較,arr[6] > arr[7]  所以arr[6]的數據和arr[7]的數據進行交換,arr[6] = 4  arr[7] = 80

第八次:arr[7]與arr[8]進行比較,arr[7] > arr[8]  所以arr[7]的數據和arr[8]的數據進行交換,arr[7] = 33  arr[8] = 80

第九次:arr[8]與arr[9]進行比較,arr[8] > arr[9]  所以arr[8]的數據和arr[9]的數據進行交換,arr[8] = 16  arr[9] = 80

總計比較了9次(數組總數 - 輪數),至此我們就完成了第一輪排序,把無序數組中最大的數移到了無序數組最後一位。

這裏我們就可以總結一下冒泡算法的實現過程,利用兩兩相比並將大的數後移的算法核心,每輪排序中將無序數組中的最大數,移動到無序數組的最後一位。

然後接下來就是按照這個方法將剩下的數據進行排序,這裏有一點需要我們注意的是,我們每次都會將無序數數組最大的數移動到最後,那麼最後面的數據就是有序的,所以對於無序數組Arr[N],我們需要進行(N - 1)輪排序,第 i 輪排序需要比較          (N - 1 - i)次。

 

二、具體代碼

/*
函數名:int BubbleSort(int data[], int n);
函數功能:使用冒泡排序的方法,將數組按從小到大排序
函數參數:
         data[]:數組首地址
         n:參與排序的數據個數
函數返回值:
          函數成功排序數組返回0,失敗返回-1
*/

int BubbleSort(int data[], int n)
{
	if (NULL == data)
	{
		printf("\n data is null in %s\n", __FUNCTION__);
		return NULL_ERR;
	}
	
	int i = 0;
	int j = 0;
	int k = 0;
	int temp = 0;
	
	for (i = 0; i < n -1; i++)
	{
		for (j = 0; j < n -1 - i; j++)
		{
			if (data[j] > data[j + 1])
			{
				temp = data[j];
				data[j] = data[j + 1];
				data[j + 1] = temp;
			}
		}
		
	}
		
	return OK;
	
}

這裏我們需要注意的是,對於arr[N]的數組,我們需要進行(N - 1)輪比較,因爲最後一輪的時候只有一個數,自身就有序,每輪比較只需要比較(N - 1 - i)次,是因爲比較完 i 輪之後,數組最後 i 個數據是有序的。具體看原理講解的圖上紅框中的數據。

 

倉促成文,不當之處,尚祈方家和讀者批評指正。聯繫郵箱[email protected]

 

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