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上一道从排序数组删除重复项的小题,刚开始没看到是从排序数组中,就乱写,其实要是排序树组,就比乱序的感觉上好写多了.然后就想回顾下冒泡法对数组排序,凭 ...
随机推荐
- 20个可能你不知道Linux网路工具
如果要在你的系统上监控网络,那么使用命令行工具是非常实用的,并且对于 Linux 用户来说,有着许许多多现成的工具可以使用,如: nethogs, ntopng, nload, iftop, iptr ...
- gulp的使用以及Gulp新手入门教程
Gulp新手入门教程 原文 http://w3ctrain.com/2015/12/22/gulp-for-beginners/ Gulp 是一个自动化工具,前端开发者可以使用它来处理常见任务: 搭 ...
- PowerShell中进行文件读取,信息排序,分类计数。
这是国外某大学QA的一道作业题,读取mainlog文件中的每一行信息,并获取有效的信息,也就是每条信息中第四个@后面的内容,然后进行分类与计数,要求是用Perl写,但我是用PowerShell完成的, ...
- VBA学习笔记(3)--文件夹操作
说明(2017.3.22): 1. 根据兰色幻想VBA80集视频教学,总结 2. 大部分可以用自带函数处理,不过复制文件夹需要用到FileSystemObject对象,打开文件夹用到shell Pub ...
- 【Unity/C#】DateTime时间字符串,月份用英文显示
制作一个钟表,要求效果如下图: 由于每一部分的字体大小不同,我分别使用了不同的Text控件.(不懂dalao们有没有更科学的办法) 把这些Text控件包含在一个Object下,给该Object定义一个 ...
- uboot全局数据gd_t、bd_t和device_t
gd_t定义在include/asm-arm/global_data.h 33 /* Keep it *SMALL* and remember to set CFG_GBL_DATA_SIZE &g ...
- WPF教程四:布局之DockPanel面板
DockPanel:停靠面板 DockPanel定义一个区域,在此区域中,您可以使子元素通过描点的形式排列,这些对象位于 Children 属性中.停靠面板类似于WinForm中控件的Dock属性.D ...
- 异常:Error:Execution failed for task ':app:compileDebugJavaWithJavac'. > Compilation failed; see the compiler error output for details.
碰到这个异常我也是挺无语的,因为Android Studio根本不会提示你详细的错误信息. 我们来看看这个博主:http://blog.csdn.net/runner__1/article/detai ...
- r语言 包说明
[在实际工作中,每个数据科学项目各不相同,但基本都遵循一定的通用流程.具体如下] [下面列出每个步骤最有用的一些R包] 1.数据导入以下R包主要用于数据导入和保存数据:feather:一种快速,轻 ...
- jQuery Masonry-让你的网页更自然的强大的动态不规则布局插件!
Masonry是 一款非常强大的jQuery动态网格布局插件,可以帮助开发人员快速开发类似剪贴画的界面效果.和CSS中float的效果不太一样的地方在 于,float先水平排列,然后再垂直排列,使用M ...