常用排序算法归纳(1)——冒泡排序

本文详细介绍了冒泡排序的概念、算法思路及其实现过程,并通过实例演示了如何使用C语言完成排序,同时提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念:

冒泡排序,是对桶排序改进的一种排序,不仅解决了浪费空间的问题,而且还可以进行浮点数的比较和输出一些必要的信息,容易实现由小到大(由大到小)的一种排序方法。

二、算法思路

    1、每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来;

    2、用两层for循环进行比较:1>外层循环控制轮数;

                               2>内层循环实现数的两两比较。

说明:如果有N个数,则要进行N-1轮比较。在第一轮比较中要进行N-1次两两比较,在第j轮比较中进行N-j次两两比较。

三、图解:

说明:用冒泡排序实现下面5个数由大到小排序。

原始数据:

    34         67         90         43         124  

第一轮:

       124     |     124    |   124    |    124     |   34

       43       |     43      |   43      |    34      |   124

       90       |     90      |   34      |    43      |    43

       67       |     34      |   90      |    90      |    90

       34       |     67      |   67      |    67      |    67

解析:

1、形象直观地看出,最小的数在这一轮的比较中不断上升一位,直到升到最后一位。就如同是一个气泡,一步一步往后“翻滚”,直到最后一位。所以这个排序的方法有一个很好听的名字“冒泡排序”。

2、在这一轮中进行了4次两两比较(N-1次比较)。

第一轮排序后: 67    90    43    124    34

在接下来的几轮的比较中与第一轮的比较方法相同

第二轮排序后: 90    67    124    43    34

第三轮排序后: 90    124    67    43    34

第四轮排序后: 124    90    67    43    34

四、代码实现:

#include <stdio.h>

# define N 5

void print_arry(int *a,int len)
{
    int i;
    for(i = 0;i < len;i++)
    {
        printf("%d ",*(a+i));
    }
    printf("\n");
}

void bubble_sort(int *a,int len)
{
    int i,j,n,temp;

    for(i = 0;i < len-1;i++)
    {
        for(j = 0;j < len-1-i;j++)
        {
            if(a[j] < a[j+1])
            {
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
        for(n = 0;n < len;n++)           //打印排序过程
        {
            printf("%d ",a[n]);
        }
        printf("\n");
        getch();
    }
}

int main()
{
    int a[N] = {34,67,90,43,124};
    int i;
    printf("原数组\n");
    print_arry(a,sizeof(a)/sizeof(a[0]));
    printf("排序过程\n");
    bubble_sort(a,sizeof(a)/sizeof(a[0]));
    printf("排序后\n");
    print_arry(a,sizeof(a)/sizeof(a[0]));

    return 0;
}



五、复杂度:

时间复杂度:O(n² ),最好的情况下是O(n );

空间复杂度:O(1)。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值