原理
數組
其原理是從亂序數組中的第一個位置的數據開始,讓其與相鄰的數字比較,若是相鄰數字比該數字小(或大,這根據你想要升序結果仍是降序結果決定),就交換兩個位置,依次向後比較交換,知道數組最後。一輪結束之後,最大(或最小)的數字會被放在最後一個位置,再重複上述冒泡過程一輪,則第二大(或小)數字被放在了倒數第二個位置,這樣反覆進行n次(n表示數組的長度),冒泡排序過程結束。
ide
複雜度分析spa
冒泡的時間複雜度是O(n2),由於在最壞的狀況下,每一個數據都會被遍歷n(n爲數組長度)次;空間複雜度是O(1),由於其在原數組的基礎上將兩個數字交換,並無向系統申請多餘空間。排序
改進input
原始冒泡每次排序都要將每一個數字遍歷n次,有這麼一種狀況,數組自己就近於有序,原本能夠冒泡一次就能夠排好序,原始冒泡要求須要冒泡n次。改進冒泡原理以下,咱們能夠用一個flag記錄遍歷的過程,如有交換動做,就認爲排序未結束;若沒有交換動做,則認爲數組有序,不須要遍歷,直接退出循環。
it
C語言實現(改進冒泡)class
void *Malloc(size_t size) { void *rst = malloc(size); if(NULL == rst){ fprintf(stderr, "Over flow!\n"); } return rst; } void swap(void *a, void *b, int size) { void *tmp = Malloc(size); memcpy(tmp, a, size); memcpy(a, b, size); memcpy(b, tmp, size); free(tmp); } Boolean bubble(int *arr, int arrlen) { int i = 0, j= 0; int sort_ok = TRUE; // user a flag to record if the array is sort ok. if(NULL == arr || 0 >= arrlen){ printf("Invalid input arr...\n"); return FALSE; } for(i = 0; i < arrlen; ++i){ sort_ok=TRUE; for(j = 1; j < arrlen; ++j){ if(arr[j] < arr[j - 1]){ swap(&arr[j], &arr[j-1], sizeof(arr[0])); sort_ok = FALSE; } } if(TRUE == sort_ok){ break; } } }