第十八章 Caché 算法与数据结构 选择排序

文章目录

第十八章 Caché 算法与数据结构 选择排序

基本思想

  • 简单选择排序是最简单直观的一种算法,每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。
  • 在算法实现时,每一轮确定最小元素的时候会通过不断地比较交换来使得首位置为当前最小,交换是个比较耗时的操作。其实我们很容易发现,在还未完全确定当前最小元素之前,这些交换都是无意义的。
  • 因此可以通过设置一个变量min,每一次比较出存储较小元素,并且记录当前元素的数组下标,当本轮循环结束之后,那这个变量min存储的就是当前最小元素的下标,此时再执行交换操作,以此确定本轮遍历的最小元素放到了数组前部。

时间复杂度

  • 单选择排序通过上面优化之后,无论数组原始排列如何,比较次数是不变的;对于交换操作,在最好情况下也就是数组完全有序的时候,无需任何交换移动,在最差情况下,也就是数组倒序的时候,交换次数为n-1次。综合下来,时间复杂度为O(n2)

算法描述

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

  1. 初始状态:无序区为R[1…n],有序区为空;
  2. 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  3. n-1趟结束,数组有序化了。

image

完整示例

插入类

Class PHA.YX.Arithmetic.SelectionSort Extends %RegisteredObject
{

Method sort(array As PHA.YX.Arithmetic.Array)
{
	for i = 0 : 1 : array.length(){
		#dim min as %Integer = i
		for j = i + 1 : 1 : array.length - 1 {
			if (array.get(j) < array.get(min)){
				s min = j 
			}
		}
		if (min '= i){
			s array =  ..swap(array , i , min)
		}
	}
	q array
}

Method swap(array As PHA.YX.Arithmetic.Array, i As %Integer, min As %Integer)
{
	#dim temp as %Integer = array.get(i)
	d array.set(i, array.get(min))
	d array.set(min, temp)
	q array
}

}

调用

/// w ##class(PHA.YX.Arithmetic).SelectionSort()
ClassMethod SelectionSort()
{
	#dim array as PHA.YX.Arithmetic.Array = ##class(PHA.YX.Arithmetic.Array).%New()
	d array.init(8)
	d array.insert(0,52)
	d array.insert(1,63)
	d array.insert(2,14)
	d array.insert(3,59)
	d array.insert(4,68)
	d array.insert(5,35)
	d array.insert(6,67)
	d array.insert(7,99)
	
	#dim sort as PHA.YX.Arithmetic.SelectionSort = ##class(PHA.YX.Arithmetic.SelectionSort).%New() 
	s array = sort.sort(array)
	
	d array.output()
	
	q ""
}
DHC-APP>w ##class(PHA.YX.Arithmetic).SelectionSort()
14
35
52
59
63
67
68
99
 

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/106932919