java-直接选择排序
直接选择排序是一种简单的排序方法,它每次从当前待排序的区间中选择出最小的元素,把该元素与该区间的第一个元素交换。
第一次从a[0]~a[n-1]中选取最小值,与a0]交换,第二次从a[1]~a[n-1]中选取最小值,与a[1]交换,....,第i次从a[i-1]~a[n-1]中选取最小值,与a[i-1]交换,.....,第n-1次从a[n-2]~a[n-1]中选取最小值,与a[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
例如:假定n = 8,数组a中8个元素的排序码为:
(36,25,48,12,65,43,20,58)
如图给出了进行每次选择并交换后各排序码位置的变动情况,中括号中为待排序区间,中括号前面为已经排好的元素。

直接选择排序的算法用java描述为:
public static void selectionSort(int[] a,int n) {
if(n>a.length) {
System.out.println("超出数组长度");
System.exit(1);
}
for (int i = 1; i < n; i++) { //i表示次数,共进行n-1次选择和交换
int minIndex = i-1; //用minIndex表示最小元素的下标
for (int j = i; j < n; j++) {//找到当前排序区间中最小元素的下标
if(a[minIndex]>a[j]) {//如果后面的元素小于当前最小元素,则用minIndex记录下后面最小元素的下标
minIndex = j;
}
}
if(minIndex != i) {//如果minIndex==i,说明minIndex就是当前排序区间首位元素的下标,因此不用交换
int temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}
}
完整代码并测试:
import java.util.Scanner;
public class SelectionSort {
public static void selectionSort(int[] a,int n) {
if(n>a.length) {
System.out.println("超出数组长度");
System.exit(1);
}
for (int i = 1; i < n; i++) { //i表示次数,共进行n-1次选择和交换
int minIndex = i-1; //用minIndex表示最小元素的下标
for (int j = i; j < n; j++) {//找到当前排序区间中最小元素的下标
if(a[minIndex]>a[j]) {//如果后面的元素小于当前最小元素,则用minIndex记录下后面最小元素的下标
minIndex = j;
}
}
if(minIndex != i-1) {//如果minIndex==i-1,说明minIndex就是当前排序区间首位元素的下标,因此不用交换
int temp = a[i-1];
a[i-1] = a[minIndex];
a[minIndex] = temp;
}
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入元素的个数");
int n = input.nextInt();
int[] a = new int[n];
System.out.println("请依次输入元素");
for (int i = 0; i < a.length; i++) {
a[i] = input.nextInt();
}
System.out.println("请输入待排元素的个数");
int m = input.nextInt();
selectionSort(a,m);
System.out.println("排序之后");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
}
请输入元素的个数
8
请依次输入元素
36 25 48 12 65 43 20 58
请输入待排元素的个数
8
排序之后
12 20 25 36 43 48 58 65
效率:
在直接选择排序中,共需要进行n-1次选择和交换,每次选择需要比较n-i 次(1<=i<=n-1),每次交换最多需要3次移动,因此,总的比较次数:C=(n*n - n)/2,
总的移动次数(最大值): 3(n-1).由此可知,直接选择排序的时间复杂度为 O(n^2)。由于在直接选择排序中存在着前后元素之间的互换,因而可能会改变相同元素的前后位置,如4,3,4,2 第一次4和2交换,第一个4跑到了第3个4之后,所以此方法是不稳定的。
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上一道从排序数组删除重复项的小题,刚开始没看到是从排序数组中,就乱写,其实要是排序树组,就比乱序的感觉上好写多了.然后就想回顾下冒泡法对数组排序,凭 ...
随机推荐
- objective-c中所谓的僵尸对象
正常情况下向已回收的对象发送消息时灵时不灵,具体要看该对象所占内存有没有被覆写.cocoa提供了僵尸对象(Zombie Object)这个功能,简单的说:启用该调试功能后,运行时会将所有已回收的实例转 ...
- 【11】-java递归和非递归二叉树前序中序后序遍历
二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历. 遍历二叉树 是指以一定的次序访问二叉树中的每个结点.所谓 访问结点 是指对结点进行各种操作的简称.例如,查询结点数据域的内容,或输出它的值,或 ...
- LeetCode之旅(16)-Climbing Stairs
题目描述: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either ...
- 关于masm中OFFSET伪指令对结构的影响
在masm中,如果offset修饰全局变量,则他返回的是变量的相对于其所在段的偏移,并且offset不能修饰局部变量哦. 若offset修饰的是文字常量则将被忽略: VAL = 1000h mov e ...
- IT轮子系列(一)——DropDownList 的绑定,你秒懂了吗
前言 最近猛然惊觉(说是猛然,是因为自己工作那么多年,居然不自知.不反省),在开发中,自己碰到一些常用的功能代码块,还是习惯性的baidu,然后copy....这样的操作,不知自己重复了多少遍.现在回 ...
- x&(x-1)
x&(x-1)可以用来求出x是否为2幂次方数:当&的结果为0时,x原值是2幂次方数,否则就不是2幂次方数: x=x&(x-1)即把x从低位开始的第一个1改成0.如1000,把1 ...
- 用 Javascript 实现的“Dual listbox”(双向选择器)
这是我用 Javascript 制作的"Dual listbox"(双向选择器)的一个应用示例,是从我的代码中抠出来的.在网页编程中经常会用到. 也许我的实现太烦琐了,希望大家有更 ...
- Java Web开发中路径问题小结
Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...
- Oracle面试过程中常见的二十个问题
1.冷备份和热备份的不同点以及各自的优点 解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份.而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库.热备份的优点在于当备份时, ...
- JMM
1.JMM简介 i.内存模型概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓 ...