排序: 选择排序

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,一经查实,立即删除!

相关文章

JavaScript的值传递和引用传递

原文: Explaining Value vs. Reference in Javascript译者: Fundebug为了保证可读性&#xff0c;本文采用意译而非直译。另外&#xff0c;本文版权归原作者所有&#xff0c;翻译仅用于学习。 JavaScript有5种基本的数据类型&#xff0c;分别是&#xff1a;布尔、null、undefine…

全景摄像技术大有可为

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

C#编程(五十三)----------字典DictionaryTKey,TValue

字典 关键字:Dicitionary 说明: 必须包含命名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由两个元组组成:键和值). 键必须是唯一的,而值不需要唯一的. 键和值都可以是任意类型(例如:string,int,自定义类型,等等) 通过一个键读取一个值的事件是接…

setInterval只执行一次的原因

1 setInterval(arrow(),2000) 改为&#xff1a; 1 setInterval(arrow,2000) 原因&#xff1a; arrow()这是一个函数调用&#xff0c;函数调用就会有返回值&#xff0c; 而arrow()没有返回值&#xff0c;所以这里的arrow()是一个undefined&#xff0c;自然你想要的循环执行arrow…

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

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

Android 模拟输入那点事

因工作原因&#xff0c;需要用到模拟输入这个东东&#xff0c;查阅了一些资料&#xff0c;实现方式有多种&#xff0c;我大概分为两类&#xff0c;命令行类和程序类。 命令行类包括自动化测试组件monkeyrunner&#xff0c;getevent/setevent命令&#xff0c;input命令 程序类包…

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…

[No0000111]java9环境变量配置bat

保存成bat&#xff08;utf-8 无签名 编码&#xff09; 右键以管理员权限运行 修改JAVAINSTALLPATH 为JAVA SDK 安装目录&#xff08;默认用C:\PROGRAM FILES\JAVA\&#xff09;即可&#xff1b; 只在 用户变量下 创建&#xff0c;会事先保存好用户原有的“JAVA_HOME,JRE_HOME,P…

去掉浮夸,空杯心态重新面对测试

刚开始一头扎进软件测试行业&#xff0c;从踏踏实实的机械化功能测试&#xff0c;到学会和甲方扯皮&#xff0c;到被鄙视的五体投地后抓紧修炼表面功夫来忽悠人&#xff0c;学的最多的反而是怎么与人交流。第一次面对跳槽的机会&#xff0c;我竟然发现自己的测试能力不升反降。…

PASTE Splay

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

linux 用户空间通过makefile向程序传递参数

一. 用户空间 因为实际上进行预处理的只是Gcc工具&#xff0c;而make工具只是一个解决依赖关系的工具。所以问题就简化成如何通过make向gcc传递参数。通过简单的例子来说明&#xff1a;hello.c#include <stdio.h> void main(void) {#ifdef DEBUG printf("y…

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

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

Web开发者不可不知的16条原则

HTML已经走过了近20的发展历程。从HTML4到XHTML&#xff0c;再到最近十分火热的HTML5&#xff0c;它几乎见证了整个互联网的发展。但是&#xff0c;即便到现在&#xff0c;有很多基础的概念和原则依然需要开发者高度注意。下面&#xff0c;小编向大家介绍这些应该遵循的开发原则…

MIPI DSI协议介绍

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

NSArray、NSDictionary、NSString存储、删改、遍历

NSString 创建一个NSString实例&#xff1a;NSString *str “this is string”;//字面量语法 常用API&#xff1a; stringWithFormat //创建动态字符串 -&#xff08;NSUInteger&#xff09;length //获取字符的数量 -isEqualToString: //判断两个字符串是否相等 -uppercaseSt…

2018.11.14成立我的博客

2018.11.14成立我的博客转载于:https://www.cnblogs.com/zengxx/p/9957509.html

130242014018-郑志良-第2次实验

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

Hi3516A开发--挂载SD卡和U盘

一、SD卡 1、通过fdisk -l命令确认板子上的Linux系统是否识别SD卡 / # fdisk -l Disk /dev/mmcblk0: 63.8 GB, 63864569856 bytes 255 heads, 63 sectors/track, 7764 cylinders Units cylinders of 16065 * 512 8225280 bytes Device Boot Start …

【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服务器访问日志的生…