// bubble sorting void bubble_sort(int *a, int size) { int i, surface; //surface for putting the largest value after sorting for i loop for (surface = size - 1; surface > 0; --surface) // sorting like bubble, compare then and // switch them if larger bubble is on the left // hand side(a[i]), and finally we will get // the largest value for (i = 0; i < surface; ++i) if (a[i] > a[i+1]) swap(a + i, a + i + 1); } // swap two values void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; }程式請直接放入這支程式的 int main()上方,接著在那支程式的"func"的位置下面放上
bubble_sort(b, arry_size); printf("The result of bubble sort:\n"); for (i = 0; i < arry_size; ++i) printf("%d ", b[i]); puts("");
for (i = 0; i < surface; ++i) if (a[i] > a[i+1]) swap(a + i, a + i + 1);這個部分是bubble sort的主要原理部分, swap就是直接交換這兩個放入指標的值. 這個迴圈就是從泡泡的最底層一個一個去檢視泡泡的大小a[i]以及a[i+1], 如果底下那顆a[i]比上面那顆a[i+1]大顆,那麼就交換它們的位置,可以把它想成大顆的泡泡往上擠,硬把上面那顆小顆的往下壓. 當然遇到比他塊頭一樣或更大的(a[i] <= a[i+1])就不擠了,當然檢視一樣沒有中斷,就繼續檢視上面這顆,讓他繼續往上擠,照著這樣的方式我們就會檢視到水面,也就是surface這邊了.
因此照這樣的想法來看的話,我們在這次檢視過後,到最後在水面的必然就是這次檢視中最大顆的,要強調的就是"這次檢視". 因為我們會有好幾次檢視. 所以跑完第一次surface迴圈,我們找到最大顆的並且她因為不斷的往上擠的緣故所以跑到了表層,也就是這個array的最右邊. 接下來的迴圈
for (surface = size - 1; surface > 0; --surface)就是把水面往下壓, 因為這次檢視中最大顆的已經跑出水面了, 我們就沒必要再次的去比較它, 我們只需要比較水面底下剩下的那些小嘍囉, 因此就是把水面往下壓,直到剩下那顆泡泡(surface > 0) 至於為什麼不要(surface >= 0)的原因就是因為剩下的那顆理所當然的就是最小的,沒有必要再去比較了.
因此這個程式到最後array最右邊的就會是最大顆的,接著它的左邊那個就會是第二次檢視中最大顆的,那麼問題來了, 這左邊那顆會比右邊那顆還大嗎? 答案是不會, 因為我們在第一次檢視中選取的就會是最大顆的,不要忘記,最先冒出水面的當然是最大顆的. 因此接著之後冒出來的都必然會相等或是更小,不會更大.
至於swap這支程式就不多做敘述了, 不在資料結構這邊討論的範疇,這是C語言的pointer, 有興趣的人請自行google pointer以及function的關聯. 基本上這支swap程式就是交換傳入的兩個value而已.
沒有留言:
張貼留言