排序算法——冒泡排序(C语言实现)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法——冒泡排序(C语言实现)相关的知识,希望对你有一定的参考价值。
原理
其原理是从乱序数组中的第一个位置的数据开始,让其与相邻的数字比较,如果相邻数字比该数字小(或大,这根据你想要升序结果还是降序结果决定),就交换两个位置,依次向后比较交换,知道数组最后。一轮结束以后,最大(或最小)的数字会被放在最后一个位置,再重复上述冒泡过程一轮,则第二大(或小)数字被放在了倒数第二个位置,这样反复进行n次(n表示数组的长度),冒泡排序过程结束。
复杂度分析
冒泡的时间复杂度是O(n2),因为在最坏的情况下,每个数据都会被遍历n(n为数组长度)次;空间复杂度是O(1),因为其在原数组的基础上将两个数字交换,并没有向系统申请多余空间。
改进
原始冒泡每次排序都要将每个数字遍历n次,有这么一种情况,数组本身就近于有序,本来可以冒泡一次就可以排好序,原始冒泡要求需要冒泡n次。改进冒泡原理如下,我们可以用一个flag记录遍历的过程,若有交换动作,就认为排序未结束;若没有交换动作,则认为数组有序,不需要遍历,直接退出循环。
C语言实现(改进冒泡)
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; } } }
本文出自 “11219885” 博客,请务必保留此出处http://11229885.blog.51cto.com/11219885/1751514
以上是关于排序算法——冒泡排序(C语言实现)的主要内容,如果未能解决你的问题,请参考以下文章