热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言实例——四种排序算法(冒泡排序、选择排序、插入排序、快速排序)

C语言排序算法BBTime一、冒泡排序1、原理2、代码二、选择排序1、原理2、代码三、插入排序1、原理2、代码四、快速排序1、原理2、代码3、操作过程BBAgain代码均以按从小到

C 语言排序算法

  • BB Time
  • 一、冒泡排序
    • 1、原理
    • 2、代码
  • 二、选择排序
    • 1、原理
    • 2、代码
  • 三、插入排序
    • 1、原理
    • 2、代码
  • 四、快速排序
    • 1、原理
    • 2、代码
    • 3、操作过程
  • BB Again

代码均以按从小到大排序为例
只写出来了排序的函数,减少博客冗余内容
若叙述存在差错,烦请大佬指出

BB Time

这个学期开了数据结构的课程,需要用到 C 语言,但是颓废太久感觉已经忘的差不多了。再加上有学弟(妈呀,我才上了四个月大一就已经成学长了)来问我排序算法,所以把之前的博客重新整理下,当作复习,也希望能帮到刚开始学 C 语言的小伙伴们。

一、冒泡排序

1、原理

通过两层循环,相邻两个数进行比较,将较大的数向后移动。第一轮循环选出最大值,第二轮选出次大值,依此类推。
因较大值不断向后移动,类似于冒泡泡,故称「冒泡排序」。

2、代码

void bubble(int a[], int n) {
int i,j,t;
for(i=0; i for(j=0; j if(a[j] > a[j+1]) {
int t = a[j];
a[j] = a[j+1];
a[j+1]=t;
}
}
}
二、选择排序

1、原理

从第一个数据开始,依次选择出来与之后的数据依次比较,若小于后面的数据,则交换两者值,再继续进行比较。
以为过程中依次选择数据,故称「选择排序」。

2、代码

void select(int a[], int n) {
int i,j,k;
for(i = 0; i k = i;
for(j = i+1; j if(a[j] k = j;
if(k != i) {
t = a[i];
a[i] = a[k];
a[k] = t;
}
}
}
三、插入排序

1、原理

从数组中第二位开始,每次循环将待排序的元素插入到比他大的元素上一位,依次循环,直到将数据全部排序。
以为是将待排序元素插入到已排序序列中去,故称「插入排序」。

2、代码

insertsort(int *k,int n)
{
int i,j,t;
for(i=1; i t = k[i];
j = i - 1;
while(j>=0 && k[j]>t) {
k[j+1] = k[j];
j--;
}
k[j+1] = t;
}
}
四、快速排序

1、原理

在待排序的数据中,取第一个数为基准值,将小于等于和大于该基准值的数据分为两组,再不断对分出的这两组分别排序(需要使用到递归算法),直到每组只剩一个数据。
快速排序相当于是冒泡排序的一个升级,将原本从一端开始的排序优化为两侧同时进行,在数据量巨大时能显著提升运行速度,故称为「快速排序」。

2、代码

void quick(int a[], int start, int end) {
int l,r;
l=start;
r=end;
a[0]=a[start];
while (l while (la[0])
r—;
if (l a[l]=a[r];
l++;
}
while (l l++;
if (l a[r]=a[l];
r--;
}
}
a[l]=a[0];
if (start quick(a, start, r-1);
if (end>r)
quick(a, r+1, end);
}

3、操作过程

定义数组时多定义一位,将 a[0] 设置为比较的基准,在 quick 函数中定义 l 左探针和 r 右探针,分别从左到右和从右到左扫描数组,在左右探针未相遇的时候判断右探针值是否大于基准值,将小于基准的右探针和大于基准的左探针交换,将第一位基准归位,其左侧值皆小于基准,右侧均大于,对其左右分别递归,得出最终结果。

BB Again

排序作为刚开始学习 C语言过程中的重要算法,在之后可能会经常用到,所以可以把它们写成函数记在小本本上,需要的时候拿出来 cmd+C/V 就好哈哈哈。
希望能对 和去年这个时候的我一样刚开始学习计算机编程的小伙伴 提供一些帮助~


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 本文介绍了解决Facebook脸书面试题中插入区间的方法,通过模拟遍历的方式判断当前元素与要插入元素的关系,找到插入点并将新区间插入。同时对算法的时间复杂度和空间复杂度进行了分析。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
author-avatar
我是被催族
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有