排序: 选择排序

1. 基本原理

将待排序的元素分为已排序(初始为空)和未排序两组,依次将未排序的元素中值最小的元素放入已排序的组中。

 

直接选择排序简单直观,但性能略差;堆排序是一种较高效的选择排序方法,但实现起来略微复杂。

 

2. 直接选择排序

基本过程为:

  • 在一组元素R[i]到R[n]中选择具有最小关键码的元素
  • 若它不是这组元素中的第一个元素,则将它与这组元素中的第一个元素对调。
  • 除去具有最小关键字的元素,在剩下的元素中重复第(1)、(2)步,直到剩余元素只有一个为止。

 

 

3. 代码实现

  1 package com.windy.sort;
  2 
  3 import java.util.Arrays;
  4 
  5 import org.junit.Test;
  6 
  7 public class SelectSort {
  8 
  9     class DataWrap implements Comparable<DataWrap> {
 10         int data;
 11         String flag;
 12 
 13         public DataWrap(int data, String flag) {
 14             this.data = data;
 15             this.flag = flag;
 16         }
 17 
 18         @Override
 19         public String toString() {
 20             return data + flag;
 21         }
 22 
 23         @Override
 24         public int compareTo(DataWrap dw) {
 25 
 26             return this.data > dw.data ? 1 : (this.data == dw.data ? 0 : -1);
 27 
 28         }
 29     }
 30 
 31     @Test
 32     public void test1() {
 33 
 34         DataWrap[] dw = new DataWrap[] { 
 35                 new DataWrap(-9, ""), 
 36                 new DataWrap(1, ""),
 37                 new DataWrap(-47, "*"),
 38                 new DataWrap(1246, ""), 
 39                 new DataWrap(758, ""), 
 40                 new DataWrap(-123, ""), 
 41                 new DataWrap(5, ""),
 42                 new DataWrap(638, ""), 
 43                 new DataWrap(-47, ""), 
 44                 new DataWrap(5, "*")
 45                 };
 46 
 47         System.out.println("排序前:\n" + Arrays.toString(dw));
 48         selectSort(dw);
 49         System.out.println("排序后:\n" + Arrays.toString(dw));
 50     }
 51 
 52     @Test
 53     public void test2() {
 54         DataWrap[] dw = new DataWrap[] { 
 55                 new DataWrap(-9, ""), 
 56                 new DataWrap(1, ""),
 57                 new DataWrap(-47, "*"),
 58                 new DataWrap(1246, ""), 
 59                 new DataWrap(758, ""), 
 60                 new DataWrap(-123, ""), 
 61                 new DataWrap(5, ""),
 62                 new DataWrap(638, ""), 
 63                 new DataWrap(-47, ""), 
 64                 new DataWrap(5, "*")
 65                 };
 66 
 67         System.out.println("排序前:\n" + Arrays.toString(dw));
 68         selectSort2(dw);
 69         System.out.println("排序后:\n" + Arrays.toString(dw));
 70     }
 71 
 72     // 直接选择排序
 73     private static void selectSort(DataWrap[] dw) {
 74 
 75         int length = dw.length;
 76 
 77         System.out.println("排序中...");
 78 
 79         for (int i = 0; i < length - 1; i++) {
 80 
 81             for (int j = i + 1; j < length; j++) {
 82                 if (dw[i].compareTo(dw[j]) > 0) {
 83                     DataWrap temp;
 84                     temp = dw[i];
 85                     dw[i] = dw[j];
 86                     dw[j] = temp;
 87                 }
 88             }
 89 
 90             System.out.println(Arrays.toString(dw));
 91         }
 92 
 93     }
 94 
 95     /*
 96      * 直接选择排序改进版 用临时变量记录最小值的下标,而不是选择马上交换 在对比一轮结束之后,才选择交换
 97      */
 98     private static void selectSort2(DataWrap[] dw) {
 99         int length = dw.length;
100 
101         System.out.println("排序中...");
102         for (int i = 0; i < length - 1; i++) {
103             int min = i;
104 
105             for (int j = i + 1; j < length; j++) {
106                 // 用最小值去对比,而不是dw[i]
107                 if (dw[min].compareTo(dw[j]) > 0) {
108                     min = j;
109                 }
110             }
111 
112             DataWrap temp;
113             temp = dw[i];
114             dw[i] = dw[min];
115             dw[min] = temp;
116 
117             System.out.println(Arrays.toString(dw));
118         }
119 
120     }
121 
122 }
View Code

 

结果打印:

排序前:
[-9, 1, -47*, 1246, 758, -123, 5, 638, -47, 5*]
排序中...
[-123, 1, -9, 1246, 758, -47*, 5, 638, -47, 5*]
[-123, -47*, 1, 1246, 758, -9, 5, 638, -47, 5*]
[-123, -47*, -47, 1246, 758, 1, 5, 638, -9, 5*]
[-123, -47*, -47, -9, 1246, 758, 5, 638, 1, 5*]
[-123, -47*, -47, -9, 1, 1246, 758, 638, 5, 5*]
[-123, -47*, -47, -9, 1, 5, 1246, 758, 638, 5*]
[-123, -47*, -47, -9, 1, 5, 5*, 1246, 758, 638]
[-123, -47*, -47, -9, 1, 5, 5*, 638, 1246, 758]
[-123, -47*, -47, -9, 1, 5, 5*, 638, 758, 1246]
排序后:
[-123, -47*, -47, -9, 1, 5, 5*, 638, 758, 1246]

 

4. 算法效率分析

  • 算法的时间效率:无论初始状态如何,在第i趟排序中选择最小关键码的元素,需做n-i次比较,因此总的比较次数为:

        

 

  • 算法的空间效率:空间效率很高,只需要一个附加程序单元用于交换,其空间效率为O(1)

 

  • 算法的稳定性:不稳定

转载于:https://www.cnblogs.com/fengze/p/6608138.html

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

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

相关文章

全景摄像技术大有可为

网络摄像机发展至今&#xff0c;已经基本满足了“高清”、“日夜监控”、“远距离监控”的需求&#xff0c;但是 随着细分市场的发展&#xff0c;超广角摄像机需求逐渐凸显出来。主要应用在会议室、办公室、大厅/大堂、商场、仓库、车间等大面积开阔的区域&#xff0c;解决原来…

java文件传输之文件编码和File类的使用

---恢复内容开始--- 我们知道&#xff0c;在用户端和服务端之间存在一个数据传输的问题&#xff0c;例如下载个电影、上传个照片、发一条讯息。在这里我们 就说一下文件的传输。 1.文件编码 相信大家小时候玩过积木&#xff08;没玩过也看过吧&#xff09;&#xff0c;看到一个…

arm-linux-gcc:Command not found的问题

标签&#xff1a; ubuntulinux 2015-05-15 10:47 680人阅读 评论(0) 收藏 举报 分类&#xff1a; Ubuntu&#xff08;23&#xff09; /etc/profile gcc&#xff08;9&#xff09; ARM汇编指令&#xff08;4&#xff09; 折腾了一天&#xff0c;终于搞定了。 ubuntu没有roo…

PASTE Splay

题目描述 我们用文本处理器来处理一个特殊的文本文件&#xff0c;该文本文件共有N行文本&#xff0c;每一行文本仅包含一个自然数&#xff0c;第一行为1、第二行为2&#xff0c;以此类推至N行为自然数N。   假设对该文本文件执行一次“剪切和粘贴”操作含义如下&#xff1a;…

Spring---基于Spring IOC的小程序

实现的功能以及各文件间的关系 IHelloMessage&#xff1a;一个接口&#xff0c;用于定义输出问候信息。 HelloWorld、HelloChina&#xff1a;接口的实现类。在这里表示人在不同的地方 Person&#xff1a;一个人物类&#xff0c;调用IHelloMessage接口&#xff0c;向用户输出问候…

MIPI DSI协议介绍

原文地址&#xff1a;http://blog.csdn .NET/qq160816/article/details/19555957 一、MIPI MIPI&#xff08;移动行业处理器接口&#xff09;是Mobile Industry Processor Interface的缩写。MIPI&#xff08;移动行业处理器接口&#xff09;是MIPI联盟发起的为移动应用处理器制…

130242014018-郑志良-第2次实验

一、实验目的 1&#xff0e;熟悉体系结构的风格的概念 2&#xff0e;理解和应用管道过滤器型的风格。 3、理解解释器的原理 4、理解编译器模型 二、实验环境 硬件&#xff1a; 软件&#xff1a;Python或任何一种自己喜欢的语言 三、实验内容 1、实现“四则运算”的简易翻译器。…

【BZOJ 4170】 4170: 极光 (CDQ分治)

4170: 极光 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 121 Solved: 64Description "若是万一琪露诺&#xff08;俗称rhl&#xff09;进行攻击&#xff0c;什么都好&#xff0c;冷静地回答她的问题来吸引她。对方表现出兴趣的话&#xff0c;那就慢慢地反问。在她考…

自动生成web服务器日志解析规则

2019独角兽企业重金招聘Python工程师标准>>> 当前web服务器的多样化使得访问日志的数据清洗变得越来越复杂&#xff0c;企业需要投入专业的数据清洗人员编写数据清洗规则&#xff08;解析规则或者解析正则&#xff09;&#xff0c;或者需要关心web服务器访问日志的生…

mybatis一级缓存二级缓存

一级缓存 Mybatis对缓存提供支持&#xff0c;但是在没有配置的默认情况下&#xff0c;它只开启一级缓存&#xff0c;一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下&#xff0c;我们使用同一个SqlSession对象调用一个Mapper方法&#xff0c;往往只执…

mysql简单创建数据库权限(待修改备注)

CREATE DATABASE web DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;一、环境&#xff1a;CentOS 6.8mysql 5.6二、背景给外包的工作人员提供我司某台服务器的 mysql 中某个数据库的访问权限。之所以要做限制&#xff0c;是防止他们对我司其他的数据库非法进行操作。三、…

ISP 图像传感器camera原理

1、Color Filter Array — CFA 随着数码相机、手机的普及&#xff0c;CCD/CMOS 图像传感器近年来得到广泛的关注和应用。 图像传感器一般都采用一定的模式来采集图像数据&#xff0c;常用的有 BGR 模式和 CFA 模式。BGR 模式是一种可直接进行显示和压缩等处理的图像数据模式&am…

51nod 1027 大数乘法

1027 大数乘法基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 0 难度&#xff1a;基础题收藏关注给出2个大整数A,B&#xff0c;计算A*B的结果。 Input第1行&#xff1a;大数A 第2行&#xff1a;大数B (A,B的长度 < 1000&#xff0c;A,B > 0&#xff…

C#如何开发多语言支持的Winform程序

C# Winform项目多语言实现(支持简/繁/英三种语言)有很多种方案实现多语言&#xff0c;我在这里介绍一种最简单最容易理解的&#xff0c;作为教学材题应该从通俗易懂入手。在写这篇文章之前&#xff0c;本来想用枚举窗体对象成员的方式设置语言&#xff0c;但是找不到源代码了&a…

Alpha 冲刺 (2/10)

Alpha 冲刺 &#xff08;2/10&#xff09; 队名&#xff1a;第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬&#xff08;组长&#xff09; 过去两天完成了哪些任务&#xff1a; 文字/口头描述&#xff1a; 1、学习qqbot库&#xff1b; 2、实时保存…

Linux C语言调用C++动态链接库

Linux C语言调用C动态链接库 标签&#xff1a; C调用C库 2014-03-10 22:56 3744人阅读 评论(0) 收藏 举报 分类&#xff1a; 【Linux应用开发】&#xff08;48&#xff09; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 如果你有一个c做的动态…

HTTP Live Streaming直播(iOS直播)技术分析与实现

不经意间发现&#xff0c;大半年没写博客了&#xff0c;自觉汗颜。实则2012后半年&#xff0c;家中的事一样接着一样发生&#xff0c;实在是没有时间。快过年了&#xff0c;总算忙里偷闲&#xff0c;把最近的一些技术成果&#xff0c;总结成了文章&#xff0c;与大家分享。 前些…

noip模拟赛 遭遇

分析&#xff1a;暴力挺好打的&#xff0c;对于前30%的数据神搜&#xff0c;hi相同的数据将所有的建筑按照c从小到大排序&#xff0c;看最多能跳多少,ci0的数据将所有的建筑按照h从小到大排序&#xff0c;枚举起点和终点&#xff0c;看能否跳这么多,取个max就可以了.这样70分就…

揭开全景相机创业真相:国外一开源国内就自主

今年以来全景相机有了一个大爆发&#xff0c;国外Google、三星、诺基亚等大厂都进入了这个领域&#xff0c;国内也有很多厂商推出了全景相机。 Bubl全景相机国外一开源&#xff0c;国内就自主。这在VR&#xff08;虚拟现实&#xff09;领域体现的淋漓尽致——Google的Cardborad…

福大软工1816 · 团队现场编程实战(抽奖系统)

值得一看的补充版本演示视频 软工锦鲤在这里程序版本链接及说明 按时提交版本 以基础功能为主github链接&#xff1a;first version测试环境说明 本程序在python 3.6以上环境下运行操作说明&#xff1a; 键入抽奖关键词&#xff0c;支持&#xff1a;#我要红包#或“我要换组“或…