常用的排序方法有冒泡排序法,选择排序法,插入排序法以及希尔排序法等。本文着重讲解如何利用C代码,实现冒泡排序。

首先,要了解什么是冒泡排序。冒泡排序是常用的一种排序方法,其基本方法就是逐次比较。即一次比较两个数,若它们的顺序错误,则它们交换;重复进行,直到没有需要交换为止。

以升序排序为例:

1、比较相邻数字的大小,若第一个数比第二个数大,则相互交换;

2、对每一对相邻的数作相同的工作,那么最后的数应该是最大的数;

3、针对所有数(除了最后一个)重复上述步骤,直到没有任何一对数字需要比较为止。

需要注意的是,第3条中所谓的“最后一个”是指前几步中已经处理过的最大的数,而不是整个数列的最后一个数。

例如,将下列数列用冒泡排序法从小到大重新排列;

49 38 65 97 76 13 27 49

每次排序后数列的变化如下:

第一趟排序:38 49 65 76 13 27 49 97

第二趟排序:38 49 65 13 27 49 76 97

第三趟排序:38 49 13 27 49 65 76 97

第四趟排序:38 13 27 49 49 65 76 97

:

:

:

经过一系列过程,最终数列次序为:13 27 3849 49 65 76 97.

通过对以上排序的分析,我们可以简要画出冒泡排序的流程图:

观察流程图,我们不难发现通过一个简单的循环结构,即可实现对一组数进行排序。

部分程序如下:

#include

int main ()

{

int i, j,temp;

int array[n];

for (i = 0;i <8; i++)

{

scanf ("%d",&array[i]); //通过数组和循环输需要排序的数列

}

printf ("Before ordering,the rank is : ");

for (i = 0;i < 8 ; i++)

{

printf ("%d ",array[i]);

}

printf (" "); //显示排序之前的数组

for (j = 0;j < n-1; j++)

{

for(i = 0;i < n-j-1; i++) //两次循环实现排序

{

if (array[i] > array[i+1]) //相邻两数字比较

{

temp = array[i];

array[i] = array[i+1];

array[i+1] = temp; //中间变量temp实现相邻元素的交换

}

}

}

printf ("After ordering,the rank is :");

for(i = 0;i < n ; i++)

{

printf ("%d ",array[i]); //显示排序后的数组

}

printf (" ");

return 0;

}

数字的排序:

#include

#define SIZE 10

int main()

{

int a[SIZE]={12 ,43,9,13,67,98,101,89,3,35};//十个数的无序数列

int i,j,t;

printf("此程序使用冒泡排序法排列无序数列! ");

//冒泡排序

for(i=0;i<10-1;i++)//n个数的数列总共扫描n-1次

{

for(j=0;j<10-i-1;j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束

{

if(a[j]>a[j+1])//后一位数比前一位数小的话,就交换两个数的位置(升序)

{

t=a[j+1];

a[j+1]=a[j];

a[j]=t;

}

}

}

printf("排列好的数列是: ");

//输出排列好得吃数列

for(i=0;i<10;i++)

{

printf("%d ",a[i]);

}

return 0;

}

字符排序:

#include

#define SIZE 10

int main()

{

char a[SIZE]={'i','l','o','v','e','y','o','u','y','x'};//十个数的无序数列

int i,j;

char t;

printf("此程序使用冒泡排序法排列无序数列! ");

//冒泡排序

for(i=0;i<10-1;i++)//n个数的数列总共扫描n-1次

{

for(j=0;j<10-i-1;j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束

{

if(a[j]>a[j+1])//后一位数比前一位数小的话,就交换两个数的位置(升序)

{

t=a[j+1];

a[j+1]=a[j];

a[j]=t;

}

}

}

printf("排列好的字符组是: ");

//输出排列好得吃数列

for(i=0;i<10;i++)

{

printf("%c ",a[i]);

}

return 0;

}

用函数来解决这个问题:

#include

void function(char a[],int);//尤其注意,此处的函数声明必须是char a[],因为这里穿的是地址,不能仅仅使用char

int main()

{

int i;

char a[10]={'i','l','o','v','e','y','o','u','y','x'};//十个数的无序字符数列

printf("此程序使用冒泡排序法排列无序数列! ");

function(a,10);//调用冒泡排序

printf("排列好的字符组是: ");

//输出排列好得吃数列

for(i=0;i<10;i++)

{

printf("%c ",a[i]);

}

return 0;

}

void function(char a[],int m)

{

//冒泡排序

int i,j;

char t;

for(i=0;i

{

for(j=0;j

{

if(a[j]>a[j+1])//后一位数比前一位数小的话,就交换两个数的位置(升序)

{

t=a[j+1];

a[j+1]=a[j];

a[j]=t;

}

}

}

return;

}

执行情况:

知识总结:

冒泡排序法:也叫升序排序法,但是相比起二分法查找只能应用于有序数列,二如何将一个无序数列变的有序就可以使用冒泡排序法!!!

对上面的过程进行总结:

该思想体现在成续上的解法是:

实例:

冒泡排序不仅仅可以应用于数字同样可以应用于字符字母的快速排序:

C语言十个字母用冒泡法排序,冒泡排序法(C语言) - osc_wq8j2a9a的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. c语言分治法求众数重数_分治法求众数 - osc_twlari2q的个人空间 - OSCHINA - 中文开源技术交流社区...

    分治法求众数 Problem Description 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为 众数.例如,S={1,2,2,2,3,5}. ...

  2. c语言输出三门课程平均值,实验作业一 - 先奕宣202005018110的个人空间 - OSCHINA - 中文开源技术交流社区...

    缩写程序,输出以下信息: **********¥¥ ¥¥¥ This is my first C program! **********¥¥¥¥¥ int main() { printf(" ...

  3. 坐席排序java_坐席排队功能 - osc_sd6j22mg的个人空间 - OSCHINA - 中文开源技术交流社区...

    需求:坐席排队  五秒之内没请求接口认为用户不在排队 从内存移除 redis用作消息队列 1)实现过程: 用户请求接口  查询坐席有没有空闲,坐席没有空闲 继续排队   如果有 查询redis中有没有 ...

  4. 按照c语言规首字母只能是,C语言--指针 - osc_nbqoh20k的个人空间 - OSCHINA - 中文开源技术交流社区...

    [TOC] #知识内容总结 ##为什么要学习指针? 我们已经学习了如何用数组存放多个相同类型的数据并进行运算,但数组的长度在定义时必须给定以后不能再改变.如果事先无法确定需要处理数据数量,应该如何处理 ...

  5. c语言选择排序输出指定趟数结果,C语言之选择排序 - 杨源鑫的个人空间 - OSCHINA - 中文开源技术交流社区...

    选择法排序是相对好理解的排序算法.假设要对含有n个数的序列进行升序排列,算法步骤是: 1.从数组存放的n个数中找出最小数的下标(算法见下面的"求最值"),然后将最小数与第1个数交换 ...

  6. 方阵循环右移c语言,C语言第二次实验报告 - osc_zfz30hgc的个人空间 - OSCHINA - 中文开源技术交流社区...

    #一.实验题目,设计思路与实现方法 题目一 11-6 方阵循环右移(20 分) 本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0.1.⋯.n−1列变换为第n−m.n−m+1. ...

  7. linux冒泡算法程序,用蛮力法解决冒泡排序 - linux-tao的个人空间 - OSCHINA - 中文开源技术交流社区...

    冒泡排序是蛮力法的另一个经典体现. 算法思想:比较列表中相邻的元素,如果是逆序的话,就交换他们的位置.重复多次之后,最大的元素就排到了最后一个位置.第二遍操作将第二个元素排到了倒数第二个位置上,这样一 ...

  8. c语言输出法雷序列,法雷(法里)序列 - osc_h0wb1wlt的个人空间 - OSCHINA - 中文开源技术交流社区...

    定义: 对任意给定的一个自然数n,将分母小于等于n的不可约的真分数按升序排列,并且在第一个分数之前加上0/1,在最后一个分数之后加上1/1,这个序列称为n级法雷数列,即法雷数列是0和1之间最简分数升序 ...

  9. 第39级台阶回溯算法c语言,五大经典算法之回溯法 - osc_9ipdey7e的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.基本概念 回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷 ...

最新文章

  1. PTA基础编程题目集-7-4 BCD解密
  2. 基于Neutron的Kubernetes SDN实践经验之谈
  3. SAP 电商云 Spartacus UI 里如何捕捉语言设置的更改
  4. 给 ABP vNext 应用安装私信模块
  5. Keil5 software packs和legacy device database分类讲解
  6. BZOJ2243[SDOI2011] 染色
  7. eclipse常用插件之FindBugs
  8. linux微信电脑版登录不了,默认Windows与Deepin系统下的微信电脑版目录
  9. 大学生发展规划与就业指导(三)万学网答案
  10. 最美应用-从Android研发工程师的角度之[厨房故事]
  11. 郑轻oj1000-从今天开始入坑C语言
  12. 利用PL/SQL查询:员工工资的等级
  13. 2019河南对口升学高考试卷计算机专业课,2019河南对口升学高考试卷计算机专业课-9页word资料...
  14. Mac下mysql安装,MySQLclient
  15. 【华人学者风采】汪萌 合肥工业大学
  16. Arm加入龙蜥社区并成为理事单位,国内开源再添国际新力量
  17. 与设备无关的位图一、DIB 文件格式
  18. 【机器视觉】工业传统视觉和3D视觉算法
  19. Pytorch的rand、randn和normal的用法及区别
  20. C语言 printf 变色,【图片】(原创)用纯C变了个变色输出字符的程序。。。【c语言吧】_百度贴吧...

热门文章

  1. mysql SQLyog导入导出csv文件
  2. Quick Cocos2dx 调试问题
  3. 点滴积累【C#】---操作xml,将xml数据显示到treeview
  4. PDF 格式优化的一点经验
  5. 【转载】扫盲概念RPA
  6. 【整理】Smartforms的导出和导入
  7. 【转】ABAP的坑1
  8. CPU的插槽类型LGA与Socket 的区别
  9. 梅赛德斯奔驰即将为Apple Watch推出应用
  10. SAP 供应商寄售业务的标准流程