java 排序原理_简单选择排序算法原理及java实现(超详细)

简单选择排序的原理

简单选择排序的原理非常简单,即在待排序的数列中寻找最大(或者最小)的一个数,与第 1 个元素进行交换,接着在剩余的待排序的数列中继续找最大(最小)的一个数,与第 2 个元素交换。以此类推,一直到待排序的数列中只有一个元素时为止。

也就是说,简单选择排序可分为两部分,一部分是选择待排序的数列中最小的一个数,另一部分是让这个数与待排序的数列部分的第1个数进行交换,直到待排序的数列只有一个元素,至此整个数列有序。

这个算法非常简单,其排序过程如

d2c2455c10664fa32a23cc14aefb2a56.png

图 1 简单选择排序的排序过程

其中的方框部分为待排序的数列部分,双下画线的元素为待排序的数列中最小的元素,单下画线的元素为待排序的数列的首元素,每一趟让它们进行交换,最终得到有序数列。

简单选择排序的实现

简单选择排序的实现代码如下:

public class SelectSort {

private int[] array;

public SelectSort(int[] array) {

this.array = array;

}

public void sort() {

int length = array.length;

for (int i = 0; i < length; i++) {

int minIndex = i;

for (int j = i + 1; j < array.length; j++) {

if (array[j] < array[minIndex]) {

minIndex = j;

}

}

if (minIndex != i) {

int temp = array[minIndex];

array[minIndex] = array[i];

array[i] = temp;

}

}

}

public void print() {

for (int i = 0; i < array.length; i++) {

System.out.println(array[i]);

}

}

}

通过代码,我们发现这个算法其实挺烂的,而且应该有可以优化的方法,这里先卖个关子。测试代码如下:

public class SortTest {

public static void main(String[] args) {

testSelectSort();

}

/**

* 简单选择排序

*/

private static void testSelectSort() {

int[] array = {5, 9, 1, 9, 5, 3, 7, 6, 1};

SelectSort selectSort = new SelectSort(array);

selectSort.sort();

selectSort.print();

}

}

选择排序的特点及性能

由于在简单选择排序中,我们一般在原本的待排序的O(1)。

在最好的情况下,每次要找的最大(或者最小)的元素就是待排序的数列的第1个元素,也就是说数列本身有序,这样我们只需要一次遍历且不需要交换,即可实现一趟排序;而在最坏的情况下,每次在数列中要找的元素都不是第 1 个元素,每次需要交换。比较的次数只与数列的长度有关,而在外部要遍历整个数列,也与长度有关,所以这样的双重循环不管在什么情况下,O(n2)。

但由于选择排序不需要一个一个地向前移动,而是直接交换,而比较所消耗的 CPU 要比交换所消耗的 CPU 小一些,所以选择排序的时间复杂度相对于

简单选择排序的优化

通过选择排序的思想,我们知道选择排序的一个重要步骤是在待排序的数列中寻找最大(或者最小)的一个元素,那么如何寻找这个元素就成为一个可以优化的点。

另外,我们每次都要寻找两个值中一个是最大值,一个是最小值。这时如果需要将数列从小到大排列,就要把最小值与待排序的数列的第1个元素进行交换,把最大值与待排序的数列的最后一个元素进行交换。这样我们一次就能寻找两个元素,使外层循环的时间缩短了一半,性能也提高了很多。而且通过一次遍历就可以直接找出两个最值,并没有其他性能损耗。这种一次找两个值的选择排序的算法实现,留给读者自己去尝试。

选择排序的适用场景

简单选择排序并不很常用,它只是选择排序的一个思想基础,选择排序还有其他方案可以实现。在理解了简单选择排序之后,我们就更容易理解和学习其他方案了。选择排序的用途非常广泛,之后我们继续讲解如何使用它们。

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

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

相关文章

python对象点方法_python面向对象知识点疏理

面向对象技术简介类:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。class类变量&#xff1a;类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。数据成员&#…

ckeditor java 上传_CKEditor粘贴图片自动上传到服务器(Java版)

环境&#xff1a;java,springmvc,ckeditor,tomcat,maven情况&#xff1a;在做项目的时候发现本地图片粘贴到ckeditor中&#xff0c;img标签的src中的值是“data:image/png;base64,”开头的&#xff0c;后面会跟一串字符串&#xff0c;图片越大字符串越长&#xff0c;这样的图片…

java 序列化声明_显式声明默认Java类序列化方法的原因是什么?

我定期看到具有以下结构的Java类&#xff1a;class MyClass implements Serializable {private static final long serialVersionUID 1L;// ...private void writeObject(final java.io.ObjectOutputStream s) throws IOException {s.defaultWriteObject();}private void read…

java 百度poi_Android应用中使用百度地图API之POI(三)

先看执行后的图吧&#xff1a;POI(Point of Interest)。中文能够翻译为“兴趣点”。在地理信息系统中。一个POI能够是一栋房子、一个商铺、一个邮筒、一个公交站等 具体&#xff1a;http://developer.baidu.com/map/sdkandev-4.htm主要应用 MKSearch 类&#xff1a;com.baidu.…

java 顺序存储键值对_java://Comparator、Comparable的用法(按照要求将map集合的键值对进行顺序输出)...

import java.util.*;public class Person implements Comparable//使Person的属性具有比较性{private String name;private int age;public Person(String name,int age)//初始化构造函数{this.name name;this.age age;}public void set(String name,int age)//重新设置姓名和…

java日历事件处理_日历表的事件处理和管理(刘静)

1 //添加gridview,显示具体的日期2 SuppressLint("ResourceAsColor")3 private voidaddGridView() {4 LinearLayout.LayoutParams params newLinearLayout.LayoutParams(5 LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);6 //取得屏幕的宽度和高度7 WindowMa…

java第四次上机作业_第十java上机作业

第十java上机作业 第七章上级作业 7.1 public class Rectangle { double width1; double height1; String color“white“; public Rectangle(){} public Rectangle(double width,double height,String color) { this.widthwidth; this.heightheight; this.colorcolor; } publi…

java解析带斜杠的参数_Java Spring MVC应用程序仅接受带有斜杠的POST请求

war文件名是forms.war。 web.xml中的url模式为"/"控制器操作的RequestMapping为"/"如果遇到localhost&#xff1a;8080 /表单&#xff0c;则RequestMethod.GET操作正常工作如果针对localhost:8080/forms点击发布数据&#xff0c;则不会触发RequestMethod.P…

java文件编码格式环境变量_Jenkins maven 构建乱码,修改file.encoding系统变量编码为UTF-8...

一切都是windows的控制台默认编码GBK问题情景&#xff1a;使用jenkins构建&#xff0c;console 输出的中文乱码。代码编码格式是utf-8&#xff0c;因为Jenkins会默认读取当前系统的编码格式&#xff0c;导致构建日志乱码和selenium自动化测试输入的中文乱码。控制台输出乱码摸索…

http multipart java_Http MultiPart请求

我正在尝试使用httpClient库上传图像(多部分/表单数据) . 我可以使用httpPost方法和byteArrayRequestEntity上传图像 . 以下是我使用的代码&#xff1a;File file new File(imageFilePath);HttpClient client new HttpClient();PostMethod method new PostMethod("http…

java分布式会话redis_详解springboot中redis的使用和分布式session共享问题

对于分布式使用NginxTomcat实现负载均衡&#xff0c;最常用的均衡算法有IP_Hash、轮训、根据权重、随机等。不管对于哪一种负载均衡算法&#xff0c;由于Nginx对不同的请求分发到某一个Tomcat&#xff0c;Tomcat在运行的时候分别是不同的容器里&#xff0c;因此会出现session不…

python3.8使用方法_python3.8新特性

python3.8新特性Python3.8稳定版已发布&#xff0c;官网发布了一篇介绍新特性的文章&#xff0c;在此记录一下。新增赋值操作符:作用&#xff1a;把较大表达式中的某部分值赋给变量,因为看起来像海象的眼睛和牙齿&#xff0c;: 操作符有个特别的名字&#xff1a;海象操作符范例…

java责任链设计模式 订单_Java责任链设计模式实例分析

本文实例讲述了Java责任链设计模式。分享给大家供大家参考&#xff0c;具体如下&#xff1a;一 代码abstract class AbstractHandler {private Handler Handler null;// 持有责任链中下一个责任处理者的引用public void setHandler( Handler handler ) {this.Handler handler…

java map去重复的数据_使用HashMap去重复数据.

因为HashMap是键值对形式&#xff0c;所以一个键只对应一个Value&#xff0c;利用这个原理&#xff0c;我们就可以根据某列重复数据做键对重复数据进行处理啦~首先先看看我要处理 的数据然后我最后想要的结果&#xff1a;需求&#xff1a;根据groupName每个分组信息只显示一条数…

centos6.5 MySQL 服务器_启用CentOS6.5 64位安装时自带的MySQL数据库服务器

本人在虚拟机上又安装了一台linux机器&#xff0c;作为MySQL数据库服务器用&#xff0c;在安装时选择了系统自带的MySQL服务器端&#xff0c;以下是启用步骤。首先开启mysqld服务#service mysqld start进入/usr/bin目录#cd /usr/bin设定mysql数据库root用户的密码#mysqladmin -…

java xml date_W3C XML 模式时间数据类型与java Date进行转换

W3C XML 模式时间数据格式:"2014-11-17T 09:40:25" 或者 “2014-11-17T 09:40:2508:00”要想把以上格式的时间转换为能被java所使用个格式有以下3种办法&#xff1a;(1)、jdk中有这么一个类XMLGregorianCalendar&#xff0c;使用XMLGregorianCalendar类中的toGreGreg…

PHP stomp 连接判断,php实现通过stomp协议连接ActiveMQ操作示例

本文实例讲述了php实现通过stomp协议连接ActiveMQ操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;前面介绍了php ActiveMQ的安装与使用&#xff0c;这里再来讲述一下php通过stomp协议连接ActiveMQ。一、安装php的stomp扩展http://pecl.php.net/package/stomp如&am…

authinfo.php,【nginxphp】后台权限认证方式

一、最常用的方法(代码中限制)1、如何限制IPfunction get_new_ip(){if(getenv(HTTP_CLIENT_IP)) {$onlineip getenv(HTTP_CLIENT_IP);} elseif(getenv(HTTP_X_FORWARDED_FOR)) {$onlineip getenv(HTTP_X_FORWARDED_FOR);} elseif(getenv(REMOTE_ADDR)) {$onlineip getenv(RE…

php数组无限文类,php把无限级分类生成数组的类

你是否遇到需要把无限级分类循环出来&#xff0c;是不是很头痛。比如&#xff0c;要循环出一个SELECT,或一个TABLE&#xff0c;要写一大堆判断。我的做法是生成数组&#xff0c;可以重复调用&#xff0c;直接循环数组就行了。为了方便&#xff0c;把它写成了类&#xff1a;clas…

php sql取数据生成数组中,php中实现数组生成要执行的sql语句

本篇文章主要介绍php中实现数组生成要执行的sql语句&#xff0c;感兴趣的朋友参考下&#xff0c;希望对大家有所帮助。会不会碰到这样一种情况呢&#xff1f;每次获取数据将数据和历史版本都有一定的差别&#xff0c;然而用ThinkPHP的addAll()函数&#xff0c;却会将已有的数据…