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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法——冒泡排序(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语言实现)

用C语言编写函数,要实现快速排序算法或者冒泡法

图解C语言冒泡排序算法,含代码分析

冒泡排序(BubbleSort)算法以及简单选择排序(SelectSort)算法实现(C语言)

C语言试题172之实现冒泡排序算法

C语言试题172之实现冒泡排序算法