Java 实现选择排序
选择排序:
原理:依次从数组最左边取一个元素,与之后的位置上的元素比較,假设大于/小于(取决于须要升序排还是降序排)。则保存较大/较小元素的索引
当一轮比較后,将保存的较大/较小元素的索引与 这轮開始比較的左边元素置换
改进了冒泡排序,交换次数从O(N^2)降低到O(N), 而比較次数还是O(N^2) 。实际上交换次数最大就等于N-1次
- /**
- * 选择排序
- * 比較次数 O(N^2), 交换O(N)
- * @author stone
- *
- */
- public class SelectionSort {
- public static void main(String[] args) {
- int len = 15;
- int[] ary = new int[len];
- Random random = new Random();
- for (int j = 0; j < len; j++) {
- ary[j] = random.nextInt(1000);
- }
- System.out.println("-------排序前------");
- // ary=new int[]{10,9,8,7,6,5,4,3,2,1}; //測试交换次数
- // ary=new int[]{1,2,3,4,5,6,7,8,10,9}; //測试交换次数
- for (int j = 0; j < ary.length; j++) {
- System.out.print(ary[j] + " ");
- }
- selectDesc(ary);
- selectAsc(ary);
- }
- /*
- * 选择排序:降序
- */
- static void selectDesc(int[] ary) {
- int compareCount = 0;//比較次数
- int changeCount = 0;//交换次数
- int len = ary.length;
- int maxValueIndex = -1; //记录一轮比較下来的最小值索引
- for (int i = 0; i < len - 1; i++) {
- maxValueIndex = i; //从0開始
- for (int j = i + 1; j < len; j++) {
- if (ary[maxValueIndex] < ary[j]) {
- maxValueIndex = j; //记录较大的索引
- compareCount++;
- }
- }
- // System.out.println("minValueIndex==" + maxValueIndex);
- if (maxValueIndex != i) {//假设跟左边的记录索引不同,则交换
- ary[i] = ary[maxValueIndex] + (ary[maxValueIndex] = ary[i]) * 0;//一步交换
- changeCount++;
- }
- }
- System.out.println("\n-------降序排序后------比較次数:" + compareCount + "。交换次数" + changeCount);
- for (int j = 0; j < ary.length; j++) {
- System.out.print(ary[j] + " ");
- }
- }
- /*
- * 选择排序:升序
- */
- static void selectAsc(int[] ary) {
- int compareCount = 0, changeCount = 0;
- int len = ary.length;
- int minIndex = -1;
- for (int i = 0; i < len - 1; i++) {
- minIndex = i;
- for (int j = i + 1; j < len; j++) {
- if (ary[minIndex] > ary[j]) {
- minIndex = j; //记录较小的索引
- compareCount++;
- }
- }
- if (minIndex != i) {//假设跟左边的记录索引不同。则交换
- ary[i] = ary[minIndex] + (ary[minIndex] = ary[i]) * 0;
- changeCount++;
- }
- }
- System.out.println("\n-------升序排序后------比較次数:" + compareCount + ",交换次数" + changeCount);
- for (int j = 0; j < ary.length; j++) {
- System.out.print(ary[j] + " ");
- }
- }
- }
打印
- -------排序前------
- 125 350 648 789 319 699 855 755 552 489 187 916 596 731 852
- -------降序排序后------比較次数:26,交换次数13
- 916 855 852 789 755 731 699 648 596 552 489 350 319 187 125
- -------升序排序后------比較次数:56。交换次数7
- 125 187 319 350 489 552 596 648 699 731 755 789 852 855 916
Java 实现选择排序的更多相关文章
- Java实现选择排序
选择排序思想就是选出最小或最大的数与第一个数交换,然后在剩下的数列中重复完成该动作. package Sort; import java.util.Arrays; public class Selec ...
- [Java]数组排序-选择排序 冒泡排序 插入排序
1 选择排序 原理:a 将数组中的每个元素,与第一个元素比较 如果这个元素小于第一个元素, 就将这个 两个元素交换. b 每轮使用a的规则, 可以选择出 ...
- 过三关 Java冒泡排序选择排序插入排序小练习
材料:猴子排序,按照身高来从小到大来排序. 第一关: 老猴子带领小猴子队伍按大小逐一比较,交换,开始高矮排列队伍.(冒泡排序) 第二关: 太慢了,给第一关增加难度,进行选择排序 第三关: 最后,尝试选 ...
- Java中选择排序,冒泡排序,插入排序,快速排序
一:冒泡法排序 //冒泡排序 注:从小到大排 //特点:效率低,实现简单 //思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素. 这只是冒泡排序 ...
- Java使用选择排序法对数组排序
编写程序,实现将输入的字符串转换为一维数组,并使用选择排序法对数组进行排序. 思路如下: 点击"生成随机数"按钮,创建Random随机数对象: 使用JTextArea的setTex ...
- java冒泡排序-选择排序-插入排序-使用API中文文档直接调用函数
import java.util.Arrays; public class ArrayDemo2_3 { public static void main(String []args) { //---- ...
- JAVA简单选择排序算法原理及实现
简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...
- JAVA数据结构--选择排序
选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然 ...
- JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并
一直到大四才开始写自己的第一篇博客,说来实在有点羞愧.今天写了关于排序的算法题,有插入排序,冒泡排序,选择排序,以下贴上用JAVA实现的代码: public class test5 { public ...
- java:选择排序法对数组排序
最近想练一练Java的算法,然后碰到LeetCode上一道从排序数组删除重复项的小题,刚开始没看到是从排序数组中,就乱写,其实要是排序树组,就比乱序的感觉上好写多了.然后就想回顾下冒泡法对数组排序,凭 ...
随机推荐
- Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE 解决方法
最近在做真机测试的时候,经常出现Installation error: INSTAL L_FAILED_INSUFFICIENT_STORAGE这个问题,导致apk没法安装到是手机上,在eclipse ...
- 第九章 搭建Hadoop 2.2.0版本HDFS的HA配置
Hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作.在hadoop1时代,只有一个NameNode.如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了.这是 ...
- AngularJS 初始化加载流程
一.AngularJS 初始化加载流程 1.浏览器载入HTML,然后把它解析成DOM.2.浏览器载入angular.js脚本.3.AngularJS等到DOMContentLoaded事件触发.4.A ...
- 如何保证RabbitMQ的消息不丢失及其背后的原理
一.消息为什么丢失 RabbitMQ默认情况下的交换机和队列以及消息是非持久化的,也就是说在服务器重启或者宕机恢复后,之前创建的交换机和队列都将不复存在,之前未消费的消息也就消失不见了.原因在于每个队 ...
- arm B和BL指令浅析
arm B和BL指令浅析 B或BL指令引起处理器转移到“子程序名”处开始执行.两者的不同之处在于:(1)BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器). ...
- XPath学习:轴(1)——child
http://www.cnblogs.com/zhaozhan/archive/2009/09/10/1563723.html ************************************ ...
- FileZilla server windows 2003系统下适用的版本
最新版的FileZilla server 在windows 2003系统下已经不能用了 http://files.cnblogs.com/files/airoot/FileZilla_Server-0 ...
- 国际化的工具类ognl utils
package yycg.util; import java.io.Serializable;import java.text.MessageFormat;import java.util.Array ...
- grub安装centos
grub安装centos http://hi.baidu.com/soulshape/item/e90302e50da5a710595dd8f7
- js获取checkbox值的方法
js获取checkbox值的方法.分享给大家供大家参考.具体实现方法如下:<html> <head> <meta http-equiv="Content-Typ ...