数据结构与算法之选择排序
一 基本介绍
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。
二 选择排序分析
选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:
第一次从 arr[0]~arr[n-1]中选取最小值,与 arr[0]交换,第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换,第三次从 arr[2]~arr[n-1]中选取最小值,与 arr[2] 交换,…,第 i 次从 arr[i-1]~arr[n-1]中选取最小值,与 arr[i-1]交换,…, 第 n-1 次从 arr[n-2]~arr[n-1]中选取最小值,与 arr[n-2]交换,总共通过 n-1 次,得到一个按排序码从小到大排列的有序序列。
对一个数组的选择排序再进行讲解
三 代码实现
package com.datastrucate.sort;
import java.util.Arrays;
/**
* ClassName:SelectSort
* Package:com.datastrucate.sort
* Description:
* 选择排序
* 思路:每趟比较找出最小数放前面
* 外层循环:n-1次
* 最小数:min = arr[i]
* 最小数下标:minIndex = i
* 內层循环:从第i+1个数开始,n次
* 比较大小,交换
* @Date:2021/3/3 17:14
* @Author:hm
*/
public class SelectSort {
public static void main(String[] args) {
//int[] arr = {101,34,119,1};
int[] arr = new int [80000];
//生成8万个随机数
for (int i = 0;i < 80000;i++){
arr[i] = (int)(Math.random()*80000);//范围为[0,80000)
}
// System.out.println("排序前:");
// System.out.println(Arrays.toString(arr));
// System.out.println("排序后:");
long start = System.currentTimeMillis();
selectSort(arr);
// System.out.println(Arrays.toString(arr));
long end = System.currentTimeMillis();
System.out.println("用时:"+(end-start)+"秒");
}
/**
* 选择排序算法
* 时间复杂度 o(n^2)
* @param arr
*/
private static void selectSort(int[] arr) {
//总结
for (int i = 0;i < arr.length-1;i++){//共n-1趟
int min = arr[i];//假定第一个数为最小数
int minIndex = i;//最小数下标
//循环比较获得最小值
for (int j = 1+i;j < arr.length;j++){
if (min > arr[j]){//记录最小值及下标
min = arr[j];
minIndex = j;
}
}
//把第一个数与最小值交换
if (minIndex != i){//最小数下标不是第一个数的下标
arr[minIndex] = arr[i];
arr[i] = min;
}
}
//原始数据:101,34,119,1
//推导过程
//第一轮交换:1,34,119,101
/* int min = arr[0];//假定第一个数为最小数
int minIndex = 0;//最小数下标
//循环比较获得最小值
for (int j = 1+0;j < arr.length;j++){
if (min > arr[j]){//记录最小值及下标
min = arr[j];
minIndex = j;
}
}
//把第一个数与最小值交换
if (minIndex != 0){//最小数下标不是第一个数的下标
arr[minIndex] = arr[0];
arr[0] = min;
}
//第二轮交换:1,34,119,101
min = arr[1];//假定第二个数为最小数
minIndex = 1;//最小数下标
//循环比较获得最小值
for (int j = 1+1;j < arr.length;j++){
if (min > arr[j]){//记录最小值及下标
min = arr[j];
minIndex = j;
}
}
//把第二个数与最小值交换
if (minIndex != 1){//最小数下标不是第二个数的下标
arr[minIndex] = arr[1];
arr[1] = min;
}
//第三轮交换:1,34,110,119
min = arr[2];//假定第二个数为最小数
minIndex = 2;//最小数下标
//循环比较获得最小值
for (int j = 1+2;j < arr.length;j++){
if (min > arr[j]){//记录最小值及下标
min = arr[j];
minIndex = j;
}
}
//把第三个数与最小值交换
if (minIndex != 2){//最小数下标不是第三个数的下标
arr[minIndex] = arr[2];
arr[2] = min;
}*/
}
}