码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法——冒泡排序(C语言实现)

时间:2016-03-16 01:28:36      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:冒泡排序   c语言实现   改进冒泡   算法   

  原理

   其原理是从乱序数组中的第一个位置的数据开始,让其与相邻的数字比较,如果相邻数字比该数字小(或大,这根据你想要升序结果还是降序结果决定),就交换两个位置,依次向后比较交换,知道数组最后。一轮结束以后,最大(或最小)的数字会被放在最后一个位置,再重复上述冒泡过程一轮,则第二大(或小)数字被放在了倒数第二个位置,这样反复进行n次(n表示数组的长度),冒泡排序过程结束。

复杂度分析

冒泡的时间复杂度是On2),因为在最坏的情况下,每个数据都会被遍历nn为数组长度)次;空间复杂度是O1),因为其在原数组的基础上将两个数字交换,并没有向系统申请多余空间。

改进

原始冒泡每次排序都要将每个数字遍历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语言实现)

标签:冒泡排序   c语言实现   改进冒泡   算法   

原文地址:http://11229885.blog.51cto.com/11219885/1751514

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!