数据结构与算法---选择排序

本文详细介绍了选择排序算法的工作原理,包括其排序规则和具体的代码实现。选择排序通过逐轮找出最小(或最大)元素并交换位置来完成排序。算法分为外层循环决定轮数,内层循环用于比较和确定最小值。此外,还提供了选择排序的Java代码示例,展示了如何对数组进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

选择排序

  • 什么是选择排序 :

选择排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。
在这里插入图片描述

  • 排序规则:

(1)选择排序一共有数组大小-1轮排序
(2)每一轮排序,又是一个循环(循环的规则)

2.1 先假定当前这个数(如果是第一轮则是第一个数)是最小数
2.2 将假定的最小数和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标
2.3 当遍历到数组的最后时,就得到本轮最小数和下标
2.4 交换

  • 代码实现:

推导过程:

//保存最小值
int min;
//保存最小值的索引
int minIndex;
//假定最小值为索引为0的元素
min = arr[0];
minIndex = 0;
for(int i = 0 + 1;i < arr.length;i++) {
	if(min > arr[i]) {
		min = arr[i];
		minIndex = i;
	}
}
//经过这一轮循环后,数组的第一个元素即为最小值
//比较过程中会出现某轮假定最小数为true的情况
//所以我们在交换前判断是否为真的最小数,即下标是否还为假定最小数它本身
if(minIndex != 0) {
arr[minIndex] = arr[0];
arr[0] = min;
}
System.out.println("第一轮:");
System.out.println(Arrays.toString(arr));

System.out.println("======================");

min = arr[1];
minIndex = 1;
//经过一轮后,最小值不再假定为索引为0的元素,而是假设下一个元素为最小值
for(int i = 1 +1;i < arr.length;i++) {
	if(min > arr[i]) {
		min = arr[i];
		minIndex = i;
	}
}
//经过这一轮循环后,数组的第二个元素即为倒数第二小的值
if(minIndex != 1) {
arr[minIndex] = arr[1];
arr[1] = min;
}
System.out.println("第二轮:");
System.out.println(Arrays.toString(arr));
public static void selectSort(int[] arr) {
	for (int i = 0; i < arr.length - 1; i++) {
		int min;
		int minIndex;
		min = arr[i];
		minIndex = i;
		for (int j = i + 1; j < arr.length; j++) {
			if (min > arr[j]) {
//			判断条件为min < arr[j]可以得到从大到小的结果
//			重置最小值和最小值的下标
				min = arr[j];
				minIndex = j;
			}
		}
		if (minIndex != i) {
			arr[minIndex] = arr[i];
			arr[i] = min;
		}
//			System.out.println("第"+j+"轮:");
//			System.out.println(Arrays.toString(arr));
	}
* 选择排序思想:分别假定第一到倒数第二个元素为最小值,然后去比较数组中没有排过序的数。
比如我现在假定第一个数为最小,如果经过内层循环遍历假定最小数的后面元素后发现假定最小数不是最小后,
出来外层循环后就置为最小(出来后已经找到最小数了),然后假定第二个数为最小,第二个假定最小数依此类推。
* 选择排序外层决定轮数(也即第1到倒数第二个元素),内层决定比较元素的个数(根据外层决定)。
* 选择排序核心:定义两个变量min,minIndex,分别记录最小值和最小值的下标。
* 他们的作用:
在内层循环中,如果我们假定的最小值不是为最小,就重置这两个数;
在外层循环中,将假定最小值arr[j](可能不是真的最小)赋值给真的最小值 --> arr[minIndex]=arr[i];
然后将假定的最小值赋值为真的最小值 --> arr[i] = min
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值