经典(java版)排序算法的分析及实现之三简单选择排序

选择排序—简单选择排序

选择排序的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子系列的最后,直到全部记录排序完毕。简单选择排序也叫直接选择排序。

基本算法:

将给定待排序序列A[0....n],第一次从A[0]~A[n-1]中选取最小值,与A[0]交换,第二次从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次,得到一个按排序码从小到大排列的有序序列。

直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接插入排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。

简单选择排序示例:

假设给定待排序数组A[0......5]={ 2,7,6,3,1,5 }

第一趟:i=0,在无序区A[0......5]中,index=4,元素最小 a[0] 和 a[4] 进行交换。得到序列:{ 1,7,6,3,2,5 }

第二趟:i=1,在无序区A[1......5]中,index=4,元素最小 a[1] 和 a[4] 进行交换。得到序列:{ 1,2,6,3,7,5 }

第三趟:i=2,在无序区A[2......5]中,index=3,元素最小 a[2] 和 a[3] 进行交换。得到序列:{ 1,2,3,6,7,5 }

第四趟:i=3,在无序区A[3......5]中,index=5,元素最小 a[3] 和 a[5] 进行交换。得到序列:{ 1,2,3,5,7,6 }

第五趟:i=4,在无序区A[4......5]中,index=5,元素最小 a[4] 和 a[5] 进行交换。得到序列:{ 1,2,3,5,6,7 }

第六趟:i=5,在无序区A[5......5]中,最后一个元素,不要交换。得到排好的序列:{ 1,2,3,5,6,7 }

按照选择排序算法:

public static void selectSort(int [] arr){
		int len = arr.length;
		for(int i=0;i<len-1;i++){
			int min = i;
			for(int j = i+1;j<len;j++){
				if(arr[j]<arr[min]){
					min =j;
				}
			}
			if(min != i){
				int temp = arr[i];
				arr[i] = arr[min];
				arr[min] = temp;
			}
		}
	}

算法复杂度

1 时间复杂度O(n^2)

选择排序耗时的操作:比较+交换位置。时间复杂度如下:

比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2,最好和最坏情况下都为O(n^2)

2 空间复杂度

由于需要一个临时变量来交换元素位,所需开辟的辅助空间跟输入数组规模无关,所以空间复杂度为:O(1)。

3 稳定性

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

时间: 2024-10-13 00:30:28

经典(java版)排序算法的分析及实现之三简单选择排序的相关文章

图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

图形化排序算法比较:快速排序.插入排序.选择排序.冒泡排序

(九)数据结构之简单排序算法实现:冒泡排序、插入排序和选择排序

d59FG8075P7伊http://www.zcool.com.cn/collection/ZMTg2NTU2NjQ=.html 312V畏蝗淤ZP哦睬http://www.zcool.com.cn/collection/ZMTg2NTU4NDQ=.html f衷4i82419s搪褂压8http://www.zcool.com.cn/collection/ZMTg2NTU4Njg=.html 75抖0瞪4豪c练偃62诵付http://www.zcool.com.cn/collection/ZM

各种排序算法的分析及java实现

各种排序算法的分析及java实现 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插入排序:直接插入排序.二分法插入排序.希尔排序. (2).

[转]各种排序算法的分析及java实现

原文:http://www.cnblogs.com/liuling/p/2013-7-24-01.html 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几

Html5 简单选择排序演示

简单选择排序,是选择排序算法的一种.基本思想:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止.由于在每次循环中,会对数值相等的元素改变位置,所以属于非稳定排序. --------------------------------------------------------------------- 如下图所示: 对简单选择排序的优化方案,是采用二元选择排序,即将其改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数.

数据结构——排序——8种常用排序算法稳定性分析

首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同.在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前. 其次,说一下稳定性的好处.排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用.基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的.另外,如果排序算法稳定,对基于比较的排序算法而言

深入浅出数据结构C语言版(17)——有关排序算法的分析

这一篇博文我们将讨论一些与排序算法有关的定理,这些定理将解释插入排序博文中提出的疑问(为什么冒泡排序与插入排序总是执行同样数量的交换操作,而选择排序不一定),同时为讲述高级排序算法做铺垫(高级排序为什么会更快). 在讨论相关定理之前,我们必须先掌握一个与顺序有关的概念:逆序数. 所谓逆序数,就是"逆序组合的个数",假设我们希望的顺序为从小到大(反之同理): 设有元素互异数列X0,X1,X2--Xn-1,(元素互异即数列中任取两数均不相等)从中任取两数作为组合(Xa,Xb),若a<

java的各种排序算法的分析及实现

一.插入排序 ?思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止. ?关键问题:在前面已经排好序的序列中找到合适的插入位置. ?方法: –直接插入排序 –二分插入排序 –希尔排序 ①直接插入排序(从后向前找到合适位置后插入) 1.基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止. java代码实现: package com.sort; public cla

Java排序算法(二):简单选择排序

[基本思想] 在要排序的一组数中.选出最小的一个数与第一个位置的数交换:然后在剩下的数中再找出最小的与第二个位置的数交换,如此循环至倒数第二个数和最后一个数比較为止. 算法关键:找到最小的那个数.并用变量记住它的下标. [java实现] public class SimpleSelectionSort { public static void main(String[] args) { int[] arr = { 9, 1, 5, 8, 3, 7, 4, 6, 2 }; System.out.p