C语言冒泡排序算实现代码

 更新时间:2016年07月16日 17:14:34   投稿:lqh  
本文主要介绍C语言冒泡排序算法,这里给大家举例说明冒泡排序的思想,并附有代码示例,有需要的小伙伴可以参考下

冒泡排序是排序算法的一种,思路清晰,代码简洁,常被用在大学生计算机课程中。

“冒泡”这个名字的由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。

这里以从小到大排序为例进行讲解。

基本思想及举例说明

冒泡排序的基本思想就是不断比较相邻的两个数,让较大的元素不断地往后移。经过一轮比较,就选出最大的数;经过第2轮比较,就选出次大的数,以此类推。

下面以对 3  2  4  1 进行冒泡排序说明。

第一轮 排序过程
3  2  4  1    (最初)
2  3  4  2    (比较3和2,交换)
2  3  4  1    (比较3和4,不交换)
2  3  1  4    (比较4和1,交换)
第一轮结束,最大的数4已经在最后面,因此第二轮排序只需要对前面三个数进行再比较。

第二轮 排序过程
2  3  1  4 (第一轮排序结果)
2  3  1  4 (比较2和3,不交换)
2  1  3  4 (比较3和1,交换
第二轮结束,第二大的数已经排在倒数第二个位置,所以第三轮只需要比较前两个元素。

第三轮 排序过程
2  1  3  4  (第二轮排序结果)
1  2  3  4  (比较2和1,交换)

至此,排序结束。

算法总结及实现

对于具有N个元素的数组R[n],进行最多N-1轮比较;

第一轮,逐个比较(R[1], R[2]),  (R[2], R[3]),  (R[3], R[4]),  …….  (R[N-1], R[N]) ;  最大的元素会被移动到R[N]上。

第二轮,逐个比较(R[1], R[2]),  (R[2], R[3]),  (R[3], R[4]),  …….  (R[N-2], R[N-1]);第二大元素会被移动到R[N-1]上。

。。。。

以此类推,直到整个数组从小到大排序。

下面给出了冒泡排序的一般实现和优化实现。一般实现是教科书里常见的实现方法,无论数组是否排序好了,都会进行N-1轮比较; 而优化实现,在数组已经排序好的情况下,会提前退出比较,减小了算法的时间复杂度。

#include<stdio.h>
#include<stdlib.h>
#define N 8
void bubble_sort(int a[],int n);
//一般实现
void bubble_sort(int a[],int n)//n为数组a的元素个数
{
  //一定进行N-1轮比较
  for(int i=0; i<n-1; i++)
  {
    //每一轮比较前n-1-i个,即已排序好的最后i个不用比较
    for(int j=0; j<n-1-i; j++)
    {
      if(a[j] > a[j+1])
      {
        int temp = a[j];
        a[j] = a[j+1];
        a[j+1]=temp;
      }
    }
  }
}
//优化实现
void bubble_sort_better(int a[],int n)//n为数组a的元素个数
{
  //最多进行N-1轮比较
  for(int i=0; i<n-1; i++)
  {
    bool isSorted = true;
    //每一轮比较前n-1-i个,即已排序好的最后i个不用比较
    for(int j=0; j<n-1-i; j++)
    {
      if(a[j] > a[j+1])
      {
        isSorted = false;
        int temp = a[j];
        a[j] = a[j+1];
        a[j+1]=temp;
      }
    }
    if(isSorted) break; //如果没有发生交换,说明数组已经排序好了
  }
}
int main()
{
  int num[N] = {89, 38, 11, 78, 96, 44, 19, 25};
  bubble_sort(num, N); //或者使用bubble_sort_better(num, N);
  for(int i=0; i<N; i++)
    printf("%d ", num[i]);
  printf("\n");
  system("pause");
  return 0;
}

相关文章

  • VS2022+libtorch+Cuda11.3安装测试教程详解(调用cuda)

    VS2022+libtorch+Cuda11.3安装测试教程详解(调用cuda)

    这篇文章主要介绍了VS2022+libtorch+Cuda11.3安装测试(调用cuda),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C/C++中可变参数的用法详细解析

    C/C++中可变参数的用法详细解析

    可变参数的使用方法远远不止以下介绍的几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    2013-09-09
  • C++中实现OpenCV图像分割与分水岭算法

    C++中实现OpenCV图像分割与分水岭算法

    分水岭算法是一种常用的图像区域分割法,本文主要介绍了OpenCV图像分割与分水岭算法,使用C++实现,具有一定的参考价值,感兴趣的可以了解一下
    2021-06-06
  • C语言 链式二叉树结构详解原理

    C语言 链式二叉树结构详解原理

    二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址
    2021-11-11
  • opencv检测直线方法之投影法

    opencv检测直线方法之投影法

    这篇文章主要为大家详细介绍了opencv检测直线之投影法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • sigsetjmp的用法总结

    sigsetjmp的用法总结

    sigsetjmp()会保存目前堆栈环境,然后将目前的地址作一个记号,而在程序其他地方调用siglongjmp()时便会直接跳到这个记号位置,然后还原堆栈,继续程序的执行
    2013-09-09
  • QT5 Thread线程的具体实现

    QT5 Thread线程的具体实现

    本文主要介绍了QT5 Thread线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 探讨C语言中关键字volatile的含义

    探讨C语言中关键字volatile的含义

    本篇文章是对C语言中关键字volatile的含义进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 详谈C语言指针

    详谈C语言指针

    这篇文章主要介绍了C语言的指针,介绍了其相关概念,然后分享了几种用法,具有一定参考价值。需要的朋友可以了解下
    2021-10-10
  • 浅析C++函数模板和类模板

    浅析C++函数模板和类模板

    C++语言的模板技术包括函数模板和类模板,模板技术是一种代码重用技术,函数和类是C++语言中两种主要的重用代码形式,这篇文章主要介绍了C++函数模板和类模板,需要的朋友可以参考下
    2022-07-07

最新评论