冒泡排序及优化 清楚直观 C语言

**

冒泡排序

**


一、冒泡排序概念

本质上就是比较两两相邻的关键字,如果前面的大就交换,否则就不变,直至需要排序的序列有序(默认从小到大)。 我在网上看到一个不错的动图,比较形象:

在这里插入图片描述
来源:https://blog.csdn.net/hcz666/article/details/117810787?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164722100016780271970540%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164722100016780271970540&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-117810787.pc_search_result_cache&utm_term=%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4187

二、具体思路

  1. 将带排序的记录放在数组arr[]中,对相邻的关键字依次进行比较,若为逆序则交换,否则不变
  2. 第二趟对前n-1个元素做同样的操作
  3. 重复以上比较和交换操作,直到在某一趟排序中,没有交换的操作,则完成排序

三、编写代码

**

1.冒泡排序

**

void BubbleSort(int *arr,int len)//冒泡排序
{
    int i,j,flag;
    for(i=0;i<len-1;i++)
    {
        flag=0;//将标志位置0
        for(j=i+1;j<len;j++)
        {
            if(arr[i]>arr[j])
            {
                Swap(&arr[i],&arr[j]);//如果前一个数大,就交换位置
                flag=1;//不是有序的,还要继续排序 
            }   
        }
        if(!flag) return;//如果已经为有序的情况,结束排序
    }
}

**

2.完整代码

**

#include <stdio.h>

void Swap(int *a,int *b)//交换
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

void BubbleSort(int *arr,int len)//冒泡排序
{
    int i,j,flag;
    for(i=0;i<len-1;i++)
    {
        flag=0;//将标志位置0
        for(j=i+1;j<len;j++)
        {
            if(arr[i]>arr[j])
            {
                Swap(&arr[i],&arr[j]);//如果前一个数大,就交换位置
                flag=1;//不是有序的,还要继续排序 
            }   
        }
        if(!flag) return;//如果已经为有序的情况,结束排序
    }
}

int main()
{
    int i;
	int testArr[]={10,9,1,4,13,6,7,9,21,0};

    //进行排序
	BubbleSort(testArr,sizeof(testArr)/sizeof(testArr[0]));
    //输出打印
	for(i=0;i<10;i++) printf("%d ",testArr[i]);

	return 0;
}

四、运行结果

在这里插入图片描述


五、总结评价

冒泡排序算法特点:

  • 稳定排序
  • 可用于链式存储结构
  • 时间复杂度高,为O(n^2),当初始无序,且n较大时,此算法不宜采用

有问题欢迎各位大佬指出
算法系列将持续更新,欢迎关注,一起学习

  • 24
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S1XmKl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值