文章目录
- 1、概述
- 2、代码实现
- 3、测试代码
1、概述
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
2、代码实现
核心思想:如果希望我们的数据按照从小到大进行排列,那么我们需要经历(n-1)次循环(最后一次只有一个数),每一次循环的目的则是为了找到剩余数据中的最小值,当我们找到了对应的最小值后,再进行一个数据的交换即可。
package pers.mobian.xuanze;
import java.util.Arrays;
public class SelectSortTest02 {
public static void main(String[] args) {
int[] arr = {1, 2, 2, 1, -1};
//1.遍历我们的整个数组
for (int i = 0; i < arr.length; i++) {
//2.我们假设当前的第一个数字就是最小的数字
int minNum = arr[i];
//3.假设当前第一个索引就是最小值的索引
int minIndex = i;
//4.遍历我们剩下的数据(除去已经排好的数据)
for (int j = i + 1; j < arr.length; j++) {
//5.如果后面的数据中存在比我们假设的数据更小的数据
if (minNum > arr[j]) {
//6.将我们一次遍历后的最小的值,赋值给真正的最小值
minNum = arr[j];
//7.将我们一次遍历后的最小值对应的索引值,赋值给真正的最小值对应的索引值
minIndex = j;
}
}
//这里可以添加一个优化的判断,如果开始的数据就是最小的,那就不需要进行数据的交换
if (minIndex != i) {
//由于我们前面保存了最小值,所以此处交换数值的时候,我们先将满足真正最小值,再满足我们假设的最小值
//8.将我们之前假设的最小值,赋值给真正最小值的位置
arr[minIndex] = arr[i];
//9.将一次遍历后的最小值,传递给真正的最小值的位置(因为之前我们的最小值是假设的)
arr[i] = minNum;
}
}
System.out.println(Arrays.toString(arr));
}
}
3、测试代码
利用我们以有的条件,进行一个小案例的测试:计算将数组长度为80000的乱序数组排序所花费的时间
package pers.mobian.xuanze;
import java.util.Arrays;
public class SelectSortTest03 {
public static void main(String[] args) {
//1.创建一个大小为80000的随机数组
int[] arr = new int[80000];
for (int i = 0; i < 80000; i++) {
arr[i] = (int) (Math.random()*80000);
}
long start = System.currentTimeMillis();
selectSort(arr);
long end = System.currentTimeMillis();
//2.计算最终的运算时间
System.out.println("选择排序所需时间为:"+(end - start));
}
//对应的选择排序方法体
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int minNum = arr[i];
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (minNum > arr[j]) {
minNum = arr[j];
minIndex = j;
}
}
if (minIndex != i) {
arr[minIndex] = arr[i];
arr[i] = minNum;
}
}
}
}
总结:对比于冒泡排序,选择排序速度更快(需要交换数据的次数少),但是是不稳定。