详解Java之冒泡排序与选择排序
作者:小夏跑不死 发布时间:2021-11-06 12:49:24
一.冒泡排序
1.概念
冒泡排序这种排序方法其实关键词就在于冒泡两个字,顾名思义就是数字不断比较然后最大的突出来,也就是说把相邻的两个数字两两比较,当一个数字大于右侧相邻的数字时,交换他们的位置,当一个数字和他右侧的数字小于或等于的时候,不交换。
2.图解
关于冒泡排序我自己画了一幅图来描述他的一轮过程
这里我举了五个无序的数{7,3,6,5,4}
由此可看出他不断与右侧相邻的数字进行比较,当他大于右边的数字就交换,否则不交换,就用这种方法不断进行排序进行很多轮,最后得出一个有序的序列{2,4,5,6,7}。
3.代码的思路
冒泡循环是一种有序的序列,有上图我们不难看出冒泡循环一轮需要进n-1次比较然后开启下一层,而且你一轮比较完了之后最后一个最大的数就不用再参与比较循环了,所以下一次的循环可以减少一次。
因此我的思路是利用两次for循环,一次循环来当取第二次循环的次数,然后依次减少第二次for循环的次数,简便了很多过程,然后数组两个相邻的数字进行依次比较,大于右边的也就是大于下一位的交换位置,否则不交换,所以我的两个for循环的代码如下(其实这也算是个万能代码,就冒泡循环这一块)当然i,k,b都需要来定义的,n为比较序列中元素个数。
这个代码也用了两次for循环所以我们不难推算出时间复杂度为o(n^2)
for(i=0;i<n-1;i++)
{
for(k=0;k<n-1-i;k++)
{ if(a[k]>a[k+1])
{ b=a[k];
a[k]=a[k+1];
a[k+1]=b;
}//交换a[k]与a[k+1]位置
}
}
4.代码例子
我自己也写了一个代码,输入a[10]序列的数字,然后冒泡循环进行排序来实现
#include<stdio.h>
int main()
{
int a[10], i, j, b, k;
for (i = 0; i < 10;i++)
{
printf("输入第%d个数为:", i+1);
scanf_s("%d", &a[i]);
}
for (k = 0; k < 9; k++)//外部循环
for (i = 0; i < 9 - k; i++)//内部循环
if(a[i] > a[i + 1])//
{
b = a[i];
a[i]= a[i + 1];
a[i + 1] = b;
}
printf("排出序列为:");
for(i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
最后运行也是成功的
二.选择排序
1.概念
选择循环的主要是选择,选择一个元素去进行比较,假如这个数比他小,换成嘞个数继续比较,最后找出最小值与数组第一位的数进行交换。然后一直这样循环下去,直到代码排序完成。也就是通过一个中间量从带排序的的数中找出最大或最小的交换到对应位置。
2.图解
关于选择排序我自己花了一幅图来描述他的一轮比较
我用了五个无序数来做例子{2,1,4,-3,3}
由此可以看出选择比较的过程,这里我用指针代指了需要的中间量,刚开始指针指向2,然后2去比较,1<2,所以指针指向较小值,指针指向1,最后就这样找出-3为最小值和第一个交换,得到第一轮循环比较的数列{-3,1,4,2,3}。
3.代码的思路
其实观察上图一轮循环次数还有循环完一轮之后,不需要用最小值比较可以看出其实他和冒泡循环有点相似,都是循环一轮需要进n-1次比较然后开启下一层,而且下一次循环可以减少一次。
所以我的思路是,依然运用两次for循环,与冒泡循环不同的是我需要一个中间商,所以我可以引用一个局部变量来帮助我,这个局部变量就是图解的指针,局部变量就是数组对应元素的位置,不断进行比较,当他小于一个数时,他就等于嘞个数的位置数,继续比较,直到循环结束找出最小值,最小值跟第一位换位置,一次循环直到排出有序序列为止。所以代码如下
for(i=o;i<n-1:i++)//循环数列取得数开始依次比较
{
int x=i;//x为中间商
for(k=i+1;k<n;k++)//从循环数列取得数后一位开始循环数列取得数进行依次比较
{
if(a[x]>a[k])//得出最小值
k=x;
if(x!=i)//将得到的最小值跟最前面的数字进行交换
{ t=a[i];
a[i]=a[x];
a[x]=t;
}
}
}
这也是一个万能代码可以用在选择序列上。
来源:https://blog.csdn.net/weixin_64448174/article/details/122094220


猜你喜欢
- 介绍TextView 是 Android 开发中最常用的小部件之一。它用于在屏幕上显示文本。但是,TextView 有几个较少为人知的功能,
- 今天PM提了个需求:用户退出当前网页时,只清除该网页访问的域名相关的cookie,保留其他域名的cookie。查了一下CookieManag
- 主要思想:将一个view设计成多层:背景层,含中奖信息等;遮盖层,用于刮奖,使用关联一个Bitmap的Canvas在该Bitmap上,使用它
- 如果JDBC连接是在自动提交模式下,它在默认情况下,那么每个SQL语句都是在其完成时提交到数据库。这可能是对简单的应用程序,但有三个原因,你
- 本文实例为大家分享了Java实现简单幸运抽奖的具体代码,供大家参考,具体内容如下代码模块:User类:package test1;publi
- 单例模式应该是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了,今天给大家分享一个我在开发过程中遇到的
- 概念装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。装饰者和被装饰对象有相同的超类型。你可以用一个或
- 本文实例为大家分享了Unity3D Shader实现镜子效果的具体代码,供大家参考,具体内容如下/p>Shader部分代码:Shade
- 相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,
- Socket异常客户端异常java.net.ConnectException: Connection refused: connect。该异
- 第一步,打开Ubuntu Software下载VSCode。(so easy)官网地址:https://code.visualstudio.
- 去年春节的时候支付宝推行的集福娃活动着实火的不能再火了,更给力的是春晚又可以全民参与咻一咻集福娃活动,集齐五福就可平分亿元大红包,只可惜没有
- Android 短信验证码自动填写1.自定义Observer监听短信数据库变化(注意添加短信权限)import android.app.Ac
- spring cloud zuul增加header传输在使用OAuth2.0传输权限认证,为了再调用其他的项目的时候获取token,必须在t
- C++编写的一个图书管理系统,供大家参考,具体内容如下2018大一的课设,搬到这纪念一下,共1200多行代码为图书管理人员编写一个图书管理系
- 方法一:需要调用win32api,winform、wpf通用[DllImport("user32.dll")]publi
- 在我们工作中涉及到一些场景需要我们配置多数据源的操作,之前来说我们配置数据源需要写繁琐的配置类来配置我们的数据源,哪个是默认数据源等等,而现
- 前言作为一个后端程序员,网络连接这块是一个绕不过的砍,当你在做服务器优化的时候,网络优化也是其中一环,那么作为网络连接中最基础的部分-TCP
- 容器类、正则表达式在几乎所有编程语言都存在的东西。很常用也很使用。下面用如下的一个控制台小程序说明C#的正则表达式与容器类的应用。开始直接输
- 前言最近,在给项目组使用Spring搭建Java项目基础框架时,发现使用Spring提供的BeanPostProcessor可以很简单方便地