C语言中的冒泡排序问题

 更新时间:2022年12月27日 09:01:24   作者:我的博尔赫斯  
这篇文章主要介绍了C语言中的冒泡排序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

冒泡排序的原理

冒泡排序的步骤

假设我们现在有一个无序数组 arr[] = { 2,9,1,3,7,6 }; 我们要用冒泡排序法让其变得有序,到底该怎么做呢?我们先来看一下思路

 在这一次(注意!是一次!)冒泡排序中,我们让这个无序数组中最大的数9排到了最后,以此类推,我们总共需要进行多少次这样的排序呢?对的,答案是5次。

好的,那么这是我们对冒泡排序外部的分析,那么一次冒泡排序在数组里面要进行多少次比较呢?

让我们想一想,第一次我们冒泡排序将最大的数9排到了最后,那么第二次还需要对9进行比较吗?

所以数组内部元素排序的比较是会随着外部冒泡排序次数而改变的。所以我们应该创建两个变量,一个用来控制外部排序次数,一个用来控制内部比较次数。接下来就上代码吧

冒泡排序代码

在这里要注意的是对于i和j的限制条件,要清楚i和j分别代表啥,并且弄清楚排序次数和比较次数就没有问题了呀

冒泡排序两种不同循环方法

在数据结构与算法这门课程中,排序算法至关重要。

冒泡排序就是其中之一,其代码我们必须烂熟于心。

原理

从表头向表尾循环,

比较相邻的两个元素大小,若前元素大于后元素,则交换两者位置。

然后继续向下比较

如下表

大的数字会慢慢置入表尾,犹如冒泡一般,大泡更快速度向水面靠近,故称之为冒泡排序

上图所示

当冒泡到第四趟以后就没必要往下面继续循环

不然会增加复杂度

我们可以增加一个标志flag

每趟冒泡之前会将flag初始化为0

假如冒泡的过程中有元素的交换,就将flag赋值为1;

在每趟冒泡之后会有检验flag是否为0

如果为0,代表没有元素交换,break;

//第一种循环方法
void BubbleSort(ElementType A[],int N){    
 
for(int p=N-1;p>0;p--){
        int flag=0;    
        for(int i=1;i<=p;i++){
            if(A[i-1]>A[i]){    //如果前面元素大于后面元素就交换 
               int temp=A[i-1];    //swap(A[i-1],A[i]);
                A[i-1]=A[i];
                A[i]=temp;
                flag=1;
            }
        }
        if(flag==0){        //一轮冒泡后并没有发生交换则说明数组已经有序
            break;          //这样做可以减少循环次数
        }
    }
}
//第二种循环方法
void BubbleSort(ElementType A[],int N){
    
    for(int i=0;i<N;i++){
        int flag=0;
        for(int j=0;j<N-i-1;j++){
            if(A[i-1]>A[i]){    //如果前面元素大于后面元素就交换
                int temp=A[i-1];    //swap(A[i-1],A[i]);
                A[i-1]=A[i];
                A[i]=temp;
                flag=1;
            }
        }
        if(flag==0){
            break;
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言结构体简单入门讲解

    C语言结构体简单入门讲解

    这篇文章主要介绍了C语言结构体简单入门讲解,本文讲述了结构体的基本定义和操作,讲解了几个比较实用的函数和案例,希望对你有所帮助
    2021-06-06
  • C++ 设置和获取当前工作路径的实现代码

    C++ 设置和获取当前工作路径的实现代码

    这篇文章主要介绍了C++ 设置和获取当前工作路径的实现代码,防止DLL加载不到配置和文件,需要的朋友可以参考下
    2017-09-09
  • C语言数据结构之单链表的实现

    C语言数据结构之单链表的实现

    链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。本文将用C语言实现单链表,需要的可以参考一下
    2022-06-06
  • 深度剖析C++对象池自动回收技术实现

    深度剖析C++对象池自动回收技术实现

    今天小编就为大家分享一篇关于深度剖析C++对象池自动回收技术实现,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • C++实现将简单密码译回原文的方法

    C++实现将简单密码译回原文的方法

    这篇文章主要介绍了C++实现将简单密码译回原文的方法,可实现将简单的字母位移类型的密码译回原文的功能,涉及C++简单字符串操作相关技巧,需要的朋友可以参考下
    2016-05-05
  • C语言:十进制,BCD码互换详解

    C语言:十进制,BCD码互换详解

    这篇文章主要介绍了C语言十进制,BCD码互换实例,小编觉得这篇文章写的还不错,实例简单明了,需要的朋友可以参考下
    2021-09-09
  • C++并查集算法简单详解

    C++并查集算法简单详解

    大家好,本篇文章主要讲的是C++并查集算法简单详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 五个嵌入式C语言中的实用技巧分享

    五个嵌入式C语言中的实用技巧分享

    这篇文章主要和大家分享一下五个嵌入式C语言中的实用技巧,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,需要的可以参考一下
    2022-12-12
  • C++中的atoi 函数简介

    C++中的atoi 函数简介

    这篇文章主要给大家分享的是C++中的atoi 函数的简单介绍,在 stdlib.h 中 atoi 函数,可用于将 char 字符串转为 int 整数类型,集体的语法操作请参考下面文章的详细内容
    2021-11-11
  • C语言实现绘制余弦曲线

    C语言实现绘制余弦曲线

    这篇文章主要为大家详细介绍了C语言实现绘制余弦曲线的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01

最新评论