排序算法(一)————冒泡排序

冒泡排序是排序算法中用法簡單,使用最廣泛的一種算法,廢話不多說,下面是其的邏輯與C語言實現:

案例:
現在有五個數:12 34 23 88 67,請使用冒泡排序將其按照從小到大排序,並求其時間複雜度。

解:
第一趟排序:
12 34 23 88 67(開始時)
12 34 23 88 67
第一次:12和34比較,34比12大,由於要從小到大,所以不需要換位
12 23 34 88 67
第二次:比較34和23,34大於23,所以要把34放到後面,兩者換位,換完後如上
12 23 34 88 67
第三次:比較34和88,88大於34,所以位置不需要交換
12 23 34 67 88
第四次:比較88和67,88大於67,所以88放到後面,結果如上,第一趟交換結束

第二趟排序:
12 34 23 67 88(第一趟結束時,此時88已經是最大的,所以這次可以不考慮它了)
12 34 23 67 88
第一次:12和34比較,34大於12,所以不用變
12 23 34 67 88
第二次:34和23比較,34大於23,所以交換位置,結果如上
12 23 34 67 88
第三次:67和88比較,88大於67,所以位置不變,第二趟交換結束

第三趟排序:
12 23 34 67 88 (第二趟結束時,此時67,88位置確定,不考慮它們)
12 23 34 67 88
第一次:12和23比較,23大於12,所以不變
12 23 34 67 88
第二次:23和34比較,34大於23,所以位置不變,第三趟交換結束

第四趟排序:
12 23 34 67 88 (第三趟結束時,此時34,67,88位置確定,不再考慮它們)
12 23 34 67 88
第一次:12和23比較,23大於12,所以位置不變,第四趟交換結束,12和23位置也確定了,整個排序結束

so,最後結果是:12 23 34 67 88

綜上過程,我們可以很容易發現一個規律,當有m個元素參與排序時,則總趟數是m-1,而對於第i趟(注意,這個i一定是從1開始遞增1的),交換次數爲m-i
根據此,我們就可以寫代碼了,C語言實現如下:

#include <stdio.h>
#include <malloc.h>
//從小到大冒泡排序
void BubbleSort(int* arr,int m)
{
	int i = 0;
	int j = 0;
	//i一定要從1開始,this is so important!!!
	for (i = 1;i < m;i++)
	{
		for ( j = 0;j < m - i;j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int t = 0;
				t = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = t;
			}
		}
	}

}
int main()
{
	int m = 0;
	int j = 0;
	printf_s("請輸入數組元素大小!");
	scanf_s("%d", &m);
	int* a= (int*)malloc(sizeof(int) * m);
	printf_s("請輸入數組元素:");
		for (int i = 0;i < m;i++)
		{
			scanf_s("%d",&j);
			a[i] = j;
		}
	BubbleSort(a, m);
	for (int i = 0; i < m; i++)
	{
		printf_s("%d\n", a[i]);
	}
	return 1;
}


你以爲到這裏就結束了麼?別搞笑了,還沒求時間複雜度呢,我們可以發現時間複雜度主要由嵌套的雙循環執行次數決定,所以時間複雜度爲:(m-1)+(m-2)+…+2+1,根據等差數列求和公式,得到執行次數:
m*(m-1)/2

即時間複雜度是O(n2

這次是真的結束了,(溜…)

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