选择排序

一)算法介绍

选择排序是一种简单直观的排序算法。属于不稳定排序

不稳定排序:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面。

备注:选择排序时间复杂度一直是O(n^2),适用于数据规模小,不占用额外内存空间的场景。​

 

二)算法原理

基本原理先从待排序的数据元素中选出最小(最大)元素,存放到起始位置(可以假设第一个元素就是最小或最大值),然后从剩下的数据中再寻找最小(最大)元素,存放到已排序元素的末尾。

算法步骤图解

源数据

第一遍排序:先假设第一个元素是最小元素,比较3>1,把1标记为最小元素,然后用最小元素1和数据中元素9、元素2、元素4、元素6依次比较,查看是否有比1还小的元素,此处没有比1还小的元素,把最小的元素1和数据中第一个元素交换位置。最小的元素就排列到第一位了。

第二遍排序:再假设第二个元素是最小元素,比较3<9,3还是最小元素,然后比较3>2,把2标记为最小元素,用最小元素2和数据中元素4、元素6依次比较,查看是否有比2还小的元素,此处没有比2还小的元素,把最小的元素2和数据中第二个元素交换位置。最小的元素就排列到第二位了。

第三遍排序:再假设第三个元素是最小元素,比较9>3,把3标记为最小元素,用最小元素3和数据中元素4、元素6依次比较,查看是否有比3还小的元素,此处没有比3还小的元素,把最小的元素3和数据中第三个元素交换位置。最小的元素就排列到第三位了。

第四遍排序:再假设第四个元素是最小元素,比较9>4,把4标记为最小元素,再比较4<6,把最小的元素4和数据中第四个元素交换位置。最小的元素就排列到第四位了。

第五遍排序:再假设第五个元素是最小元素,比较9>6,把6标记为最小元素,把最小的元素6和数据中第五个元素交换位置。最小的元素就排列到第五位了。排序完成。

算法复杂度:

最差情况:T(n) = O(n^2)

最好情况:T(n) = O(n^2)

原因:因为每一个元素都需要从头到尾循环比较一遍,才能确定最小值(最大值)。

// O(n^2)含义
for(i=0;i<100;i++) {
    for(i=0;i<100;i++){
    }
}

 

三)算法源码

算法排序步骤简介:从左到右依次假设最小(最大)元素,然后从剩余数据元素中再查找最小(最大)元素,替换到最左侧。

public static int[] selectionSort(int[] nums) {
	if (nums == null) {
		return null;
	}
		
	for (int i = 0; i < nums.length - 1; i++) {
		int minIndex = i; // 假设第一个下标元素为最小值(最大值)
			
		for (int j = i+1; j < nums.length; j++) {
			if (nums[minIndex] > nums[j]) {
				minIndex = j; // 记录最小(最大)元素的下标位置
			}
		}

		int temp = nums[minIndex]; // 把小的元素替换到前面
		nums[minIndex] = nums[i];
		nums[i] = temp;
	}
		
	return nums;
}

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值