原理
数组
其原理是从乱序数组中的第一个位置的数据开始,让其与相邻的数字比较,若是相邻数字比该数字小(或大,这根据你想要升序结果仍是降序结果决定),就交换两个位置,依次向后比较交换,知道数组最后。一轮结束之后,最大(或最小)的数字会被放在最后一个位置,再重复上述冒泡过程一轮,则第二大(或小)数字被放在了倒数第二个位置,这样反复进行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; } } }