在C语言中,常用的排序算法有:冒泡排序、快速排序、插入排序、选择排序、希尔排序、堆排序以及归并排序等等.

  冒泡排序基本概念:  依次比较相邻的两个数,将小数放在前面,大数放在后面。

 #include <stdio.h>
#include <stdlib.h>
#include <time.h> #define MAXSIZE 4 typedef struct {
int r[MAXSIZE];
int length; //用于记录顺序表的长度
}SqList; void swap(SqList *L,int i,int j)
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
} //首先初始化结构体的r数组
void main()
{
SqList n;
n.length = MAXSIZE; //srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样 int i = ;
/*
for (; i<MAXSIZE ; i++) {
n.r[i] = rand() % 101;//产生0-100的随机数
}
*/
n.r[] = ;
n.r[] = ;
n.r[] = ;
n.r[] = ; //依次输出
for (i=;i<MAXSIZE;i++) {
printf("%d\n",n.r[i]);
}
}

  1.定义一个非标准冒泡排序算法的方法

 void BubbleSort0(SqList *L)
{
// 4,3,2,1
//推导过程
//第一次外层循环
// 4和3比较 3,4,2,1
// 3和2比较, 2,4,3,1
// 3和1比较, 1,4,3,2 //第二次外层循环 从第2个元素开始
// 4和3比较 1,3,4,2
// 3和2比较 1,2,4,3 //第三次外层循环,从第3个元素开始
// 4和3比较 1,2,3,4 printf("非标准冒泡排序后结果:\n"); int i,j;
for (i=;i<L->length-;i++){
for (j=i+;j<L->length;j++){
if (L->r[i] > L->r[j])
swap(L,i,j);
}
} }

  上面也说了,此方案并不能称得上'真正'的冒泡排序(具体可以看推到过程),因为不是相邻元素两两比较

 2. 冒泡排序算法 (待优化)

 void BubbleSort(SqList *L)
{
// 4,3,2,1 , 最多循环3次 // 外层第一次循环
// j=0, 4和3比较, 3,4,2,1,
// j=1, 4和2比较, 3,2,4,1
// j=2, 4和1比较, 3,2,1,4 // 外层第二次循环 3,2,1,4
// j=0, 3和2比较, 2,3,1,4,
// j=1, 3和1比较, 2,1,3,4
// j=2, 3和4比较, 2,1,3,4 // 外层第三次循环 2,1,3,4
// j=0, 2和1比较, 1,2,3,4,
// j=1, 2和3比较, 1,2,3,4,
// j=2, 3和4比较, 1,2,3,4, // 由此可推出, 内层只需要 n - 1次循环, 外层只需要循环 n-1次即可
//从第三次外层循环可以看出,其实内循环是没有比较再去比较2和3, 3和4的 printf("冒泡排序后结果:\n");
int i,j;
for (i=;i<L->length;i++){
for (j=;j<L->length-;j++){
if (L->r[j] > L->r[j+])
swap(L,j,j+);
}
}
}

  优化后的版本:

 //冒泡排序,优化版
void BubbleSort1(SqList *L)
{
// 4,3,2,1 , 最多循环3次 // 外层第一次循环
// m = 3
// j=0, 4和3比较, 3,4,2,1,
// j=1, 4和2比较, 3,2,4,1
// j=2, 4和1比较, 3,2,1,4 // 外层第二次循环 3,2,1,4
// m = 2 , 因为最大的已经沉入最底
// j=0, 3和2比较, 2,3,1,4,
// j=1, 3和1比较, 2,1,3,4 // 外层第三次循环 2,1,3,4
// m = 1, 前面循环的2次, 最后2个元素已经排好序, 只需要循环1次,比对前2个即可
// j=0, 2和1比较, 1,2,3,4, printf("冒泡排序(优化算法)结果:\n");
int i,j,m = L->length; //m = 4
for (i=;i<L->length;i++){ m -= ; for (j=;j<m;j++){
if (L->r[j] > L->r[j+])
swap(L,j,j+);
}
}
}

  结合上面 理解冒泡排序的实现过程. 调用BubbleSort1 打印 

    BubbleSort1(&n);

     for (i=;i<MAXSIZE;i++) {
printf("%d\n",n.r[i]);
}

  

c语言冒泡排序的更多相关文章

  1. c语言冒泡排序,指针,数组

    冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复 ...

  2. 史上最详细的C语言冒泡排序算法

    未经同意,请勿转载. void bubbing(){ ] = {,,,,,,,,,};//define init the array //going to the exinternal loop,st ...

  3. c语言冒泡排序算法

    案例一: #include <stdio.h> int main(void){ int a[5]; printf("please input sort number:" ...

  4. C语言冒泡排序法分析及代码实现

    冒泡排序法: 所谓冒泡排序法,就是对一组数字进行从大到小或者从小到大排序的一种算法.具体方法是,相邻数值两两交换.从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不同,则将两个数的位置进行交换( ...

  5. c语言----- 冒泡排序 for while do-while 递归练习

    1. 冒泡排序简介(默认从小到大排序) 核心思想:只比较相邻的两个元素,如果满足条件就交换    5 8 2 1 6 9 4 3 7 0 目标:0 1 2 3 4 5 6 7 8 9 第一次排序: 5 ...

  6. C语言 · 冒泡排序

    for(int k=0;k<N;k++) {  for(int j=k+1;j<N;j++){    if(a[k]>a[j]){      int t = a[k];      a ...

  7. c 语言冒泡排序

    重要的不是代码 而是思想思路 #include<stdio.h> void Print(int *num, int n) {     int i;     for(i = 0; i < ...

  8. 以冒泡排序为例--malloc/free 重定向stdin stdout

    esort.c 代码如下,可关注下mallloc/free,freopen重定向的用法,排序为每轮将最小的数放在最前面: #include<stdio.h> #include<mal ...

  9. C语言知识汇总,史上最全面总结,没有之一

    C语言基础 C语言学习路线 C语言入门笔记 初识C语言 简单的C程序示例 我们编写的C代码是怎样跑起来的? 简单示例,VS2019调试C语言程序 C语言基础-数据类型 深入理解变量,变量的声明,定义, ...

随机推荐

  1. UIDynamicAnimator UIKit动力学

    也许是工作上并没有这方面的需要,对UIDynamicAnimator的了解不多.这里做简单的介绍: UIKit动力学是模拟真实世界的一些特性,主要就是UIDynamicAnimator类,通过类中的不 ...

  2. vi、vim 查找替换

    vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询.    :s/vivian/sky/ 替换当前行第一个 vivian ...

  3. java学习第18天(map集合)

    Map集合是将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 存储的是键值对形式的元素,键唯一,值可以重复,有点类似于数据库中的主键加数据.主要功能有: A:添加功能 put ...

  4. 手持机(Android)开发应用总结

    对于首次接触android的我,刚接到android开发的命令时,自己完全不懂任何android技术,可是由于项目的开发时间周期很短,必须强迫自己即学即用,到了最后才发现,技术其实只是工具,重要的是一 ...

  5. 利用npoi导出Excel

    npoi库是当下最流行的处理Excel.Word.PPT等Office文件格式 npoi的下载地址:http://npoi.codeplex.com/ npoi的官方学习地址: http://www. ...

  6. Openwebrtc

    https://github.com/EricssonResearch ============================= webrtc系列不错的博客 http://blog.csdn.net ...

  7. mysql命令行导入sql脚本中文变问号问题

    之前一直用工具连接mysql虽然小问题不断也都无伤大雅,最近做金融云项目,只能通过服务器的内网访问数据库,也就是说只能在linux下通过命令行访问,在导入中文的时候发现都变成问号了,经过查询资料解决, ...

  8. TFS Build Definition And Auto Deploy

    一台build machine上一般只有一个build service[对应一个build controller]来serve一个team project collection,但又workaroun ...

  9. Redis从基础命令到实战之有序集合类型(SortedSet)

    有序集合类型是Redis五种数据类型中最高级的.也是最复杂的类型.有序集合具有集合类型的特性,在其基础上给每个元素关联了一个分值,或称为权重,操作时既可以在添加元素时指定分值,也可以单独修改集合中某一 ...

  10. phpstorm之端点跟踪

    如果在断点没有实时染色,首要请检查local与remote的代码文件的对应.