c之排序问题---冒泡排序

上次掌握了插入排序之后,这次就是冒泡排序了。之前不会做总觉得很难,今天写出代码之后,还是觉得蛮简单的,希望以后学习任何一种算法都会有这种感觉。

【冒泡排序】

冒泡排序运用的是交换排序的思想,两两比较待排序的的数字,若与期望的顺序相反则交换位置,直至无反序为止。

【时间复杂度】:

若数列为反序的,则冒泡排序的最坏的时间复杂度为o(n2)在这种情况下,比较和移动次数均达到最大值:n(n-1)/2  和   3n(n-1)/2

若数列为正序的,则最好的时间复杂度为o(n)。

由于冒泡排序需要记录和移动的次数较多,所以比直接插入排序的时间性要差。

【稳定性】

冒泡排序是就地排序,所以他是稳定的。

【代码实例】:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[] = {6,2,1,3,5,4};
    int temp;
    for(int i = 0; i<5; i++){
            printf("the %d:\n",i);
        for(int j = 0; j<5-i; j++){
            if(a[j+1]<a[j]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }

        }
        for(int k = 0; k<6; k++){
            printf("%d ",a[k]);
        }
    printf("\n");
    }
    return 0;
}



【模糊点】:

在看这个冒泡排序的时候,最疑惑的就是那两个for循环了。

for(int i=0;i<length-1;i++)

         for(int j=0;j<length-1-i;j++)

第一个for循环是冒泡排序次数,第二个for循环是进行两两比较,将比较中遇到的最大的数排到最后面,而且后面那个j<length-1-i 中减去 i 的原因就是最后那个数是已经排列好的,不必再进行排列了


例如,本程序中,假设输入的是3 5 1 2 3,

当 i 为0时,j 的循环从0到 4,两两比较这五个数,并把它交换到最后面,此时array[4]=5;

当 i 为1时,j 的循环从0 到 3,两两比较前四个数字,找出其中最大的值并放在array [3]位置,

直到最后 i 为3,时,j 的循环从0到1,比较这两个数,把较大的放在array[1] 位置,较小的放在array[0] 位置。

至此排序完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值