1.1排序思路
1.2具体实现
- 选择排序的
次数
=数组大小-1 次 - 每1轮排序,又是一个循环,循环的规则:
- 先假设当前这个数是最小数
- 然后和后面的每个数比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标
- 当遍历到数组的最后时,就得到本轮最小数和下标
- 交换
1.第一轮排序
public class SelectSort {
public static void main(String[] args) {
int arr[] = {3, 1, 5, 4};
selectSort(arr);
}
//选择排序
public static void selectSort(int[] array) {
//原始数组 3,1,5,4
//第一轮排序1,3,5,4
//1.先假定最小数为第一个数
int minIndex = 0;
int min = array[0];
//2.遍历寻找最小的指
for (int j = 0 + 1; j < array.length; j++) {
if (min > array[j]) {
min = array[j];//重置min min=1
minIndex = j;//重置minIndex minIndex=1
}
}
if (minIndex != 0) {
//3.将最小值,放在arr[0],即交换
array[minIndex] = array[0];//将第一个值放到最小值的地方[3,3,5,4]
array[0] = min;//将最小值放到第一个[1,3,5,4]
System.out.println("第一轮排序:" + Arrays.toString(array));
}
}
}
第一轮排序:[1, 5, 3, 4]
2.第二轮排序:
public class SelectSort {
public static void main(String[] args) {
int arr[] = {3, 1, 5, 4};
selectSort(arr);
}
//选择排序
public static void selectSort(int[] array) {
//原始数组 3,1,5,4
//第一轮排序1,3,5,4
//1.先假定最小数为第一个数
int minIndex = 0;
int min = array[0];
//2.遍历寻找最小的指
for (int j = 0 + 1; j < array.length; j++) {
if (min > array[j]) {
min = array[j];//重置min min=1
minIndex = j;//重置minIndex minIndex=1
}
}
if (minIndex != 0) {
//3.将最小值,放在arr[0],即交换
array[minIndex] = array[0];//将第一个值放到最小值的地方[3,3,5,4]
array[0] = min;//将最小值放到第一个[1,3,5,4]
System.out.println("第一轮排序:" + Arrays.toString(array));
}
//原始数组 3,1,5,4
//第一轮排序1,3,5,4
//第二轮排序1,3,4,5
//1.先假定最小数为第一个数
minIndex = 1;
min = array[1];
//2.遍历寻找最小的指
for (int j = 1 + 1; j < array.length; j++) {
if (min > array[j]) {
min = array[j];//重置min min=3
minIndex = j;//重置minIndex minIndex=2
}
}
if (minIndex != 1) {
//3.将最小值,放在arr[1],即交换
array[minIndex] = array[1];//将第二个值放到最小值的地方[1,3,5,4]
array[1] = min;//将最小值放到第一个[1,3,5,4]
System.out.println("第二轮排序:" + Arrays.toString(array));
}
}
}
第一轮排序:[1, 5, 3, 4]
3.第三轮排序:
public class SelectSort {
public static void main(String[] args) {
int arr[] = {3, 1, 5, 4};
selectSort(arr);
}
//选择排序
public static void selectSort(int[] array) {
//原始数组 3,1,5,4
//第一轮排序1,3,5,4
//1.先假定最小数为第一个数
int minIndex = 0;
int min = array[0];
//2.遍历寻找最小的指
for (int j = 0 + 1; j < array.length; j++) {
if (min > array[j]) {
min = array[j];//重置min min=1
minIndex = j;//重置minIndex minIndex=1
}
}
if (minIndex != 0) {
//3.将最小值,放在arr[0],即交换
array[minIndex] = array[0];//将第一个值放到最小值的地方[3,3,5,4]
array[0] = min;//将最小值放到第一个[1,3,5,4]
System.out.println("第一轮排序:" + Arrays.toString(array));
}
//原始数组 3,1,5,4
//第一轮排序1,3,5,4
//第二轮排序1,3,4,5
//1.先假定最小数为第一个数
minIndex = 1;
min = array[1];
//2.遍历寻找最小的指
for (int j = 1 + 1; j < array.length; j++) {
if (min > array[j]) {
min = array[j];//重置min min=3
minIndex = j;//重置minIndex minIndex=2
}
}
if (minIndex != 1) {
//3.将最小值,放在arr[1],即交换
array[minIndex] = array[1];//将第二个值放到最小值的地方[1,3,5,4]
array[1] = min;//将最小值放到第一个[1,3,5,4]
System.out.println("第二轮排序:" + Arrays.toString(array));
}
//原始数组 3,1,5,4
//第一轮排序1,3,5,4
//第二轮排序1,3,5,4
//第三轮排序1,3,4,5
//1.先假定最小数为第一个数
minIndex = 2;
min = array[2];
//2.遍历寻找最小的指
for (int j = 1 + 1 + 1; j < array.length; j++) {
if (min > array[j]) {
min = array[j];//重置min min=4
minIndex = j;//重置minIndex minIndex=3
}
}
if (minIndex != 2) {
//3.将最小值,放在arr[2],即交换
array[minIndex] = array[2];//将第二个值放到最小值的地方[1,3,5,5]
array[2] = min;//将最小值放到第一个[1,3,4,5]
System.out.println("第三轮排序:" + Arrays.toString(array));
}
}
}
第一轮排序:[1, 3, 5, 4]
第三轮排序:[1, 3, 4, 5]
4.代码优化(降序排序)
public class SelectSort1 {
public static void main(String[] args) {
int arr[] = {3, 1, 5, 4};
System.out.println("排序前:"+Arrays.toString(arr));
selectSort(arr);
System.out.println("排序后:"+Arrays.toString(arr));
}
//选择排序
public static void selectSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
//1.先假定最小数为第一个数
int minIndex = i;
int min = array[i];
//2.遍历寻找最小的指
for (int j = i + 1; j < array.length; j++) {
if (min > array[j]) {
min = array[j];//重置min
minIndex = j;//重置minIndex
}
}
if (minIndex != i) {
//3.将最小值,放在arr[i],即交换
array[minIndex] = array[i];
array[i] = min;
}
}
}
}
排序前:[3, 1, 5, 4]
排序后:[1, 3, 4, 5]
5.升序
public class SelectSort1 {
public static void main(String[] args) {
int arr[] = {3, 1, 5, 4};
System.out.println("排序前:"+Arrays.toString(arr));
selectSort(arr);
System.out.println("排序后:"+Arrays.toString(arr));
}
//选择排序
public static void selectSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
//1.先假定最小数为第一个数
int minIndex = i;
int min = array[i];
//2.遍历寻找最小的指
for (int j = i + 1; j < array.length; j++) {
if (min < array[j]) {
min = array[j];//重置min
minIndex = j;//重置minIndex
}
}
if (minIndex != i) {
//3.将最小值,放在arr[i],即交换
array[minIndex] = array[i];
array[i] = min;
}
}
}
}
排序前:[3, 1, 5, 4]
排序后:[5, 4, 3, 1]
1.3.时间复杂度
O(n2 )
1.4测试选择排序算法速度
public class SelectSort1 {
public static void main(String[] args) {
//int arr[] = {3, 1, 5, 4};
int[] arr=new int[80000];
for (int i = 0; i < 80000; i++) {
arr[i]=(int)(Math.random()*800000);
}
Date date1 = new Date();
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format1 = simpleDateFormat1.format(date1);
System.out.println("排序前的时间是:"+format1);
//System.out.println("排序前:"+Arrays.toString(arr));
selectSort(arr);
//System.out.println("排序后:"+Arrays.toString(arr));
Date date2 = new Date();
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format2 = simpleDateFormat2.format(date2);
System.out.println("排序后的时间是:"+format2);
}
//选择排序
public static void selectSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
//1.先假定最小数为第一个数
int minIndex = i;
int min = array[i];
//2.遍历寻找最小的指
for (int j = i + 1; j < array.length; j++) {
if (min < array[j]) {
min = array[j];//重置min
minIndex = j;//重置minIndex
}
}
if (minIndex != i) {
//3.将最小值,放在arr[i],即交换
array[minIndex] = array[i];
array[i] = min;
}
}
}
}
排序前的时间是:2021-01-08 21:38:19
排序后的时间是:2021-01-08 21:38:22