一、简单选择排序
1、思想
从待排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。
2、思路
举个栗子:
以第一轮排序举例:
先假定第一个数字:101 是最小的数。通过一个循环遍历找出后面的元素中最小的数字。
第一次比较,101>34,更新一下最小数。将最小数 min置为34、最小值索引 minIndex置为2;
第二次比较,34<119,不更新。
第三次比较,34>1,更新一下最小数。将最小数 min置为1、最小值索引 minIndex置为4;
再将101和最小数1的位置互换一下,即可完成第一轮排序。
3、代码
package com.huey.sort;
import java.util.Arrays;
public class SelectSortSolo {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {
1111, 111, 11, 1 };
Select(arr);
}
public static void Select(int[] arr) {
System.out.println("原始数组为~");
System.out.println(Arrays.toString(arr));
for (int i = 0; i < arr.length - 1; i++) {
// 控制次数
int min = arr[i];// 先假定为最小值,后面再遍历比较、重新赋值
int minIndex = i;// 同理
for (int j = 1 + i; j < arr.length; j++) {
if (arr[i] > arr[j]) {
// 找到了更小的数字
// 更新最小值
min = arr[j];
minIndex = j;
}
}
// 在进行完一次遍历寻找最小值后,判断一下是否发现了更小的数字
if (minIndex != i) {
// 找到了更小的数字,下面就要交换次序
arr[minIndex] = arr[i];// 把原先假定的最小值、后来经比较发现是大的数字,交换到小的位置上【minIndex变量的作用范围比j的范围大】
arr[i] = min;
}
System.out.println("第" + (i + 1) + "次排序后~");
System.out.println(Arrays.toString(arr));
}
}
}
输出结果:
4、速度测试
package com.huey.sort;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SelectSortSolo {
public static void main(String[] args) {
// 测试选择排序的速度
int[] arr = new int[80000];
for (int i = 0; i < 80000; i++) {
arr[i] = (int) (Math.random() * 8000000);// 生成一个[0,8000000)的数
}
// 格式化时间
Date data1 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1Str = simpleDateFormat.format(data1);
System.out.println("排序前的时间是:" + date1Str);
System.out.println("正在排序中,请稍后~");
Select(arr);
Date data2 = new Date();
String date2Str = simpleDateFormat.format(data2);
System.out.println("排序后的时间是=" + date2Str);
}
public static void Select(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
// 控制次数
int min = arr[i];// 先假定为最小值,后面再遍历比较、重新赋值
int minIndex = i;// 同理
for (int j = 1 + i; j < arr.length; j++) {
if (arr[i] > arr[j]) {
// 找到了更小的数字
// 更新最小值
min = arr[j];
minIndex = j;
}
}
// 在进行完一次遍历寻找最小值后,判断一下是否发现了更小的数字
if (minIndex != i) {
// 找到了更小的数字,下面就要交换次序
arr[minIndex] = arr[i];// 把原先假定的最小值、后来经比较发现是大的数字,交换到小的位置上【minIndex变量的作用范围比j的范围大】
arr[i] = min;
}
}
}
}
结果分析:
经多次测试,绝大多数是2~3s.