冒泡排序是排序算法中用法簡單,使用最廣泛的一種算法,廢話不多說,下面是其的邏輯與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)
這次是真的結束了,(溜…)