C 冒泡排序和选择排序
冒泡排序
理论概念: 从第一个数开始,将相邻的两个数比较,第一个数和第二个数比较,比如说是从小到大的排序,要是后面的数比前面的小则交换两个的位置,这样第一轮比较基数后最大的数就到了最后面,接着进行第二轮的比较,比较到前面N-1个数,原理也是前面的那样,大的往后面不停的排,直到比较到前面只剩下一个数的时候,就完成了排序,这就是冒泡的原理:
第一层循环控制的是我们需要比较多少轮,每比较一轮我们的第二层就少比较一个值,因为最值已经被设置到最前面或者最后面。
第二层循环控制的就是两个相邻的数的比较,但由于前面说的每比较一轮我们的第二层就少比较一个值,所以这个循环控制比较的个数和第一轮是有关系的,这样就好理解for循环边界值的问题。
冒泡排序的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include "stdio.h" #define N 10 int main(){ int a[N]; int i,j,t; printf ( "请输入您要排序的%d 数字\n" ,N); /*输入十个数*/ for (i=0;i<N;i++) scanf ( "%d" ,&a[i]); /*冒泡*/ for (j=0;j<N-1;j++){ for (i=0;i<N-j;i++){ if (a[i] > a[i+1]){ t = a[i]; a[i] = a[i+1]; a[i+1] = t; } } } printf ( "排序的结果是:" ); for (i=0;i<N;i++){ printf ( "%d " ,a[i]); } } |
下面是写的过程中出现的错误分析:
选择排序
理论概念:选择排序,就像是打擂台一样,我们先选第一个位置的数为基准位置,后面的一个一个挑战,(比如我们从小到大排序),要是第二个数比第一个数小,则更换值(这时候值换了,但擂主的标记位置还是第一个)再比较第三个,要是比第一个又小,再换,直到一轮比赛结束,找到最小的在前面,接着我们开始第二轮,第二轮以第二个数为基准。后面的还是按照前面的逻辑比较,直到最后一个数,这样就整个排序过程出来了。
第一层循环控制的就是我们设置的擂主的标记,这里只设置一直比较到倒数第二个即可。
第二层就是后面一个个挑战的选手,要是一旦发现符合比较条件的,就交换他们的值,在接着和后面比较。
快速排序的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include "stdio.h" #define N 10 int main( ){ int i,j,t,k; int a[N]; printf ( "请输入你要排序的%d个整数" ,N); for (i=0;i<N;i++) scanf ( "%d" ,&a[i]); /*注意这里不能写成N 不然下面的 j 会越界*/ for (i=0;i<N-1;i++){ k=i; for (j=i+1;j<N;j++){ if (a[k]>a[j]) k=j; } if (k!=i){ t= a[i]; a[i] = a[k]; a[k] = t; } } printf ( "最终排序的结果是:" ); for (i=0;i<N;i++) printf ( "%d " ,a[i]); } |
上面就OK,这里没有什么错,最后看一下结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话