选择排序
1 基本介绍
选择式排序(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次,得到一个按排序码从小到大排列的有序序列。
2 图解分析
3 代码实现
package zuoye;
import java.util.Arrays;
public class SelectSort {
public static void main(String[] args) {
int[] arr = {101,34,119,1};
System.out.println("排序前:");
System.out.println(Arrays.toString(arr));
selectSort(arr);
System.out.println("排序后:");
System.out.println(Arrays.toString(arr));
}
//选择排序
public static void selectSort(int[] arr){
//在推导的过程中,发现了一个规律,可以使用for循环来解决
//选择排序的时间复杂度为O(n^2)
for (int i = 0; i < arr.length -1; i++){
int minIndex = i;//假定:当前最小数的下标为0
int min = arr[i]; //最小值
for (int j = i + 1; j < arr.length; j++){
if (min > arr[j]){//说明假设的最小值,并不是最小值
min = arr[j]; //重置min
minIndex = j; //重置minIndex
}
}
if (minIndex != i){
arr[minIndex] = arr[i]; //将arr[0]放到arr[minIndex]
arr[i] = min;
}
//System.out.printf("第%d轮后的排序:\n",i+1);
//System.out.println(Arrays.toString(arr));
}
/**
//使用逐步推到的方式完成选择排序
//原始数组为:[101,34,119,1]
//第一轮排序后:[1,101,34,109]
int minIndex = 0;//假定:当前最小数的下标为0
int min = arr[0]; //最小值
for (int j = 0 + 1; j < arr.length; j++){
if (min > arr[j]){//说明假设的最小值,并不是最小值
min = arr[j]; //重置min
minIndex = j; //重置minIndex
}
}
//循环完之后,min里面就是最小值,minIndex里面就是最小值的下标
// 然后将最小值放到arr[0]中,即交换
//进行优化:
if (minIndex != 0){
arr[minIndex] = arr[0]; //将arr[0]放到arr[minIndex]
arr[0] = min;
}
System.out.println("第一轮后的排序:");
System.out.println(Arrays.toString(arr)); //[1, 34, 119, 101]
//第二轮排序后:[1,34,101,119]
minIndex = 1;//假定:当前最小数的下标为0
min = arr[1]; //最小值
for (int j = 1 + 1; j < arr.length; j++){
if (min > arr[j]){//说明假设的最小值,并不是最小值
min = arr[j]; //重置min
minIndex = j; //重置minIndex
}
}
//优化:
if (minIndex != 1){
arr[minIndex] = arr[1]; //将arr[0]放到arr[minIndex]
arr[1] = min;
}
System.out.println("第二轮后的排序:");
System.out.println(Arrays.toString(arr));//[1, 34, 119, 101]
//第三轮排序后:[1, 34, 101, 119]
minIndex = 2;//假定:当前最小数的下标为0
min = arr[2]; //最小值
for (int j = 2 + 1; j < arr.length; j++){
if (min > arr[j]){//说明假设的最小值,并不是最小值
min = arr[j]; //重置min
minIndex = j; //重置minIndex
}
}
if (minIndex != 2){
arr[minIndex] = arr[2]; //将arr[0]放到arr[minIndex]
arr[2] = min;
}
System.out.println("第三轮后的排序:");
System.out.println(Arrays.toString(arr));//[1, 34, 101, 119]
*/
}
}
运行结果