简单排序算法(Java实现)

简单排序算法:冒泡排序,选择排序,插入排序

一、冒泡排序

1.1 原理:

  1. 从第一个数据开始,与第二个数据相比较,如果第二个数据小于第一个数据,则交换两个数据的位置
  2. 指针由第一个数据移向第二个数据,第二个数据与第三个数据相比较,如果第三个数据小于第二个数据,则交换两个数据的位置
  3. 依此类推,完成第一轮排序。第一轮排序结束后,最大的元素被移到了最右面
  4. 依照上面的过程进行第二轮排序,将第二大的排在倒数第二的位置
  5. 重复上述过程,没排完一轮,比较次数就减少一次

1.2 例子:

待排序数据:7, 6, 9, 8, 5,1

第一轮排序过程:

指针先指向7,7和6比较,6<7,交换6和7的位置,结果为:6,7,9,8,5,1

指针指向第二个元素7,7和9比较,9>7,不用交换位置,结果仍为:6,7,9,8,5,1

指针指向第三个元素9,比较9和8,8<9,交换8和9的位置,结果为:6,7,8,9,5,1

指针指向第四个元素9,比较9和5,5<9,交换5和9,结果为:6,7,8,5,9,1

指针指向第五个元素9,比较9和1,1<9,交换1和9的位置,结果为6,7,8,5,1,9

第一轮排序结束后,最大的数字9被移到了最右边。

进行第二轮排序,过程同上,只是由于最大的9已经放在最右边了,因此不用在比较9了,少了一次比较,
第二轮结束的结果为:6,7,5,1,8,9

第三轮结果:6,5,1,7,8,9

第四轮比较结果:5,1,6,7,8,9

第五轮比较结果:1,5,6,7,8,9

最终排序结果为:1,5,6,7,8,9,由上可知N个数据排序,需要进行N-1轮排序;第i轮排序需要的比较次数为N-i次。

1.3 代码实现

//1.冒泡排序(默认升序)O(n*n)
public void bobSort(int [] arr) {if(arr == null || arr.length<2) {return;}int temp=0, len = arr.length;for(int i=0;i<len;i++) {for(int j=i+1;j<len;j++) {if(arr[i] > arr[j]) {temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}
}

二、选择排序

选择排序是对冒泡排序的改进,它的比较次数与冒泡排序相同,但交换次数要小于冒泡排序。当数据量较大时,效率会有很大的提升,但时间复杂度仍为O(n*n)

2.1 原理:

  1. 从第一个元素开始,分别与后面的元素向比较,找到最小的元素与第一个元素交换位置
  2. 从第二个元素开始,分别与后面的元素相比较,找到剩余元素中最小的元素,与第二个元素交换
  3. 重复上述步骤,直到所有的元素都排成由小到大为止

2.2 例子:

待比较数据:7, 6, 9, 8, 5,1

第一轮:此时指针指向第一个元素7,找出所有数据中最小的元素,即1,交换7和1的位置,排序后的数据为:1,6,9,8,5,7

第二轮:第一个元素已经为最小的元素,此时指针指向第二个元素6,找到6,9,8,5,7中最小的元素,即5,交换5和6的位置,排序后的结果为:1,5,9,8,6,7

第三轮:前两个元素为排好序的元素,此时指针指向第三个元素9,找到9,8,6,7中最小的元素,即6,交换6和9的位置,排序后的结果为:1,5,6,8,9,7

第四轮:前三个元素为排好序的元素,此时指针指向第四个元素8,找到8,9,7中最小的元素,即7,交换8和7的位置,排序后的结果为:1,5,6,7,9,8

第五轮:前四个元素为排好序的元素,此时指针指向第五个元素9,找到9,8中最小的元素,即8,交换9和8的位置,排序后的结果为:1,5,6,7,8,9

到此,全部排序完成。

分析:从上面的原理可以看出,与冒泡排序不同,选择排序每排完一轮都把最小的元素移到了最左面,然后下一轮排序的比较次数比上一轮减少一次,即第i轮排序需要比较N-i次。因此,和冒泡排序一样,N个数据比较大小,需要排序N-1轮,第i轮排序需要比较N-i次。

2.3 代码实现

//2.选择排序,相对冒泡来说,改进在于交换的次数减少
//(O(n*n))
public void chooseSort(int [] arr) {if(arr == null || arr.length<2) {return;}int len = arr.length, curIndex =0, temp=0 ;for(int i=0;i<len;i++) {curIndex = i;for(int j=0;j<len-i;j++) {if(arr[curIndex] > arr[j]) {curIndex = j;}}temp = arr[curIndex];arr[curIndex] = arr[len-i-1];arr[len-i-1] = temp;}
}

3、插入排序

插入排序是简单排序中最快的排序算法,虽然时间复杂度仍然为O(n*n),但是却比冒泡排序和选择排序快很多。

3.1 原理:

  1. 将指针指向某个元素,假设该元素左侧的元素全部有序,将该元素抽取出来,然后按照从右往左的顺序分别与其左边的元素比较,遇到比其大的元素便将元素右移,直到找到比该元素小的元素或者找到最左面发现其左侧的元素都比它大,停止
  2. 此时会出现一个空位,将该元素放入到空位中,此时该元素左侧的元素都比它小,右侧的元素都比它大
  3. 指针向后移动一位,重复上述过程。每操作一轮,左侧有序元素都增加一个,右侧无序元素都减少一个

3.2 例子:

待比较数据:7, 6, 9, 8, 5,1

第一轮:指针指向第二个元素6,假设6左面的元素为有序的,将6抽离出来,形成7,,9,8,5,1,从7开始,6和7比较,发现7>6。将7右移,形成,7,9,8,5,1,6插入到7前面的空位,结果:6,7,9,8,5,1

第二轮:指针指向第三个元素9,此时其左面的元素6,7为有序的,将9抽离出来,形成6,7,_,8,5,1,从7开始,依次与9比较,发现9左侧的元素都比9小,于是无需移动,把9放到空位中,结果仍为:6,7,9,8,5,1

第三轮:指针指向第四个元素8,此时其左面的元素6,7,9为有序的,将8抽离出来,形成6,7,9,,5,1,从9开始,依次与8比较,发现8<9,将9向后移,形成6,7,,9,5,1,8插入到空位中,结果为:6,7,8,9,5,1

第四轮:指针指向第五个元素5,此时其左面的元素6,7,8,9为有序的,将5抽离出来,形成6,7,8,9,,1,从9开始依次与5比较,发现5比其左侧所有元素都小,5左侧元素全部向右移动,形成,6,7,8,9,1,将5放入空位,结果5,6,7,8,9,1。

第五轮:同上,1被移到最左面,最后结果:1,5,6,7,8,9。

3.3 代码实现

//插入排序(O(n*n),简单排序算法里效率相对最好的)
public void insertSort(int [] arr) {if(arr == null || arr.length<2) {return;}int len = arr.length, temp=0 ;for(int i=1;i<len;i++) {temp = arr[i];int j=i-1;for(;j>=0 && arr[j]>temp;j--) {arr[j+1] = arr[j];}if(j != i-1) {arr[j] = temp;}}}

4、测试代码

public static void main(String[] args) {Test test = new Test();int[] arr = {77,29,28,36,33,25,10};test.bobSort(arr);System.out.println(Arrays.toString(arr));test.chooseSort(arr);System.out.println(Arrays.toString(arr));test.insertSort(arr);System.out.println(Arrays.toString(arr));
}

5、拓展

侏儒排序(类似直接插入排序,直接插入排序更优)
https://www.cnblogs.com/9-de/p/6600640.html

图书馆排序:
基于插入排序,做的优化为在每本书之间预留一定的空隙,然后在插入的时候就能少移动一些书。说白了就是在插入排序的基础上,给书与书之间留一定的空隙,这个空隙越大,需要移动的书就越少,这是它的思路,用空间换时间

https://blog.csdn.net/u014723529/article/details/41958545

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软如何利用机器学习改进Win 10更新体验

微软在 2018 年 4 月 Windows 更新时第一次大规模使用机器学习&#xff08;ML&#xff09;&#xff0c;ML 通过监测 PC 运行状况的六个核心领域&#xff08;例如总体可靠性&#xff09;&#xff0c;以确定功能更新过程是否顺利进行。而在 2019 年 5 月发布的更新推送中&#xf…

使用.NET Core创建Windows服务(一) - 使用官方推荐方式

原文&#xff1a;Creating Windows Services In .NET Core – Part 1 – The “Microsoft” Way创建Windows服务来运行批处理任务或者运行后台任务&#xff0c;是一种非常常见的模式&#xff0c;但是由于云服务&#xff08;Amazon Lambda, Azure WebJobs以及Azure Functions&am…

Tuple VS ValueTuple

为什么有此文章首先要说的是我们公司内部技术框架是用 abp.vnext 框架整合而来的&#xff0c;我们架构师对于 abp 相关的知识都很了然于胸了。并且这个框架的确很优秀&#xff0c;省了我们前期大量基础工作。架构师把主要的架子搭建好了之后&#xff0c;把应用层与核心层让我们…

关于.NET HttpClient方式获取微信小程序码(二维码

随着微信小程序的火热应用&#xff0c;市面上有关小程序开发的需求也多了起来。近来分析了一项生成有关生成微信小程序码的需求——要求扫码跳转到小程序指定页面&#xff08;带参数&#xff09;&#xff1b;看了下小程序官方文档&#xff0c;以及网上的例子&#xff0c;未看到…

从零开始使用Skywalking分布式链路追踪系统

当我们用很多服务时&#xff0c;各个服务间的调用关系是怎么样的&#xff1f;各个服务单调用的顺序\时间性能怎么样?服务出错了&#xff0c;到底是哪个服务引起的&#xff1f;这些问题我们用什么方案解决呢&#xff0c;以前的方式是各个系统自己单独做日志&#xff0c;出了问题…

快速排序 (Quick Sort)(Java实现)

快速排序&#xff08;Quicksort&#xff09;是对冒泡排序的一种改进&#xff0c;借用了分治的思想&#xff0c;由C. A. R. Hoare在1962年提出。 1、基本思想 快速排序的基本思想&#xff1a;挖坑填数分治法。 首先选一个轴值(pivot&#xff0c;也有叫基准的)&#xff0c;通过…

使用.net core3.0 正式版创建Winform程序

前阵子一直期待.net core3.0正式版本的出来&#xff0c;以为这个版本出来&#xff0c;Winform程序又迎来一次新生了&#xff0c;不过9.23日出来的马上下载更新VS&#xff0c;创建新的.net core Winform项目&#xff0c;发现并没有Winform窗体设计器。而微软目前则是通过插件的方…

深入理解 ValueTask

.NET Framework 4 里面的命名空间为 System.Threading.Tasks的 Task 类。这个类以及它派生的 Task<TResult> 早已成为编程的主要部分&#xff0c;在 C#5 中的异步编程模式当作介绍了 async/await。在这篇文章里&#xff0c;我会覆盖新的类 ValueTask / ValueTask<TRes…

谓词筛选表达式的扩展库PredicateLib

PredicateLib是谓词筛选表达式Expression<Func<T, bool>>的一个扩展库&#xff0c;它可以帮你创建一个复杂且灵活的Expression<Func<T, bool>>&#xff0c;以作为EF、MongoDB Driver等ORM框架的查询条件。1 Predicate的创建1.1 true或false Predicatev…

NET Core 3.0 AutoFac替换内置DI的新姿势

.NET Core 3.0 和 以往版本不同&#xff0c;替换AutoFac服务的方式有了一定的变化&#xff0c;在尝试着升级项目的时候出现了一些问题。原来在NET Core 2.1时候&#xff0c;AutoFac返回一个 IServiceProvider 参数注入到ConfigureServices .NET Core 服务中&#xff0c;基本大痣…

XSS(跨站脚本攻击)攻击与防御

一、 XSS攻击原理 XSS原称为CSS(Cross-Site Scripting)&#xff0c;因为和层叠样式表(Cascading Style Sheets)重名&#xff0c;所以改称为XSS(X一般有未知的含义&#xff0c;还有扩展的含义)。XSS攻击涉及到三方&#xff1a;攻击者&#xff0c;用户&#xff0c;web server。用…

asp.net core 使用Mysql和Dapper

序曲&#xff1a;学习编程最好的方式就是敲代码&#xff0c;没有比这个更好的方法&#xff0c;哪怕你看了上百G的视频&#xff0c;都不如你自己敲几行代码更为有效。还有要记得敲完代码然后写一篇随笔来记录一下你所学所想。大家都知道&#xff0c;.netcore是微软一个具有历史意…

CSFR(跨站请求伪造)攻击与防御

一、CSRF是什么&#xff1f; CSRF&#xff08;Cross-site request forgery&#xff09;&#xff0c;中文名称&#xff1a;跨站请求伪造&#xff0c;也被称为&#xff1a;one click attack/session riding&#xff0c;缩写为&#xff1a;CSRF/XSRF。 二、CSRF可以做什么&#…

Vue 3源码公布

10 月 5 日凌晨&#xff0c;Vue.js 框架的作者兼核心开发者尤雨溪公布了尚处于 Pre-Alpha 状态的 Vue 3 源码。说学不动的童鞋抓紧剩余的假期时间撸一遍源码吧 : D作者表示&#xff0c;Vue 3 主要的架构改进、优化和新功能均已完成&#xff0c;剩下的主要任务是完成一些 Vue 2 …

简析web注入攻击

注入攻击是众多攻击之一&#xff0c;在注入攻击中&#xff0c;攻击者给程序提供恶意的输入&#xff0c;解析引擎把恶意输入作为命令或者查询的一部分&#xff0c;顺带着改变了程序执行的流程。 注入是web程序最古老的和最危险的攻击之一&#xff0c;它们能导致数据被偷&#x…

在副业刚需的时代,如何掌握副业的正确姿势?

前言近期&#xff0c;伴随着“副业刚需”这个词语的流行&#xff0c;关于“职场人要不要发展副业”的话题再一次被炒得沸沸扬扬。有人认为副业是刚需&#xff0c;是抵御中年危机的锦囊妙计&#xff0c;甚至是中年人该有的自觉&#xff0c;没有副业的人不足以谈人生&#xff0c;…

使用.NET Core创建Windows服务(二) - 使用Topshelf方式

原文&#xff1a;Creating Windows Services In .NET Core – Part 2 – The “Topshelf” Way作者&#xff1a;Dotnet Core Tutorials译者&#xff1a;Lamond Lu译文&#xff1a;使用.NET Core创建Windows服务&#xff08;二&#xff09; - 使用Topshelf方式使用.NET Core创建…

常用加密算法(Java实现)总结

1、Java的安全体系架构 Java中为安全框架提供类和接口。JDK 安全 API 是 Java 编程语言的核心 API&#xff0c;位于 java.security 包&#xff08;及其子包&#xff09;&#xff0c;以及sun.securityAPI包&#xff08;及其子包&#xff09;中。设计用于帮助开发人员在程序中同…

怎样的项目才能称为“成功项目”?

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区合伙人&#xff01;引子这个故事讲的是一家拥有百年历史的制造业大厂的信息化转型过程中的波折。这家企业拥有超过三万名员工&#xff0c;它是某行业的领先品牌&#xff0c;但是在信息化程度上却…

彩虹表

一、简介 彩虹表就是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合&#xff0c;不一定是针对MD5算法的&#xff0c;各种算法的都有&#xff0c;有了它可以快速的破解各类密码。越是复杂的密码&#xff0c;需要的彩虹表就越大&#xff0c;现在主流的彩虹表都是1…