一、选择排序思路
简单概括就是从第下标为0的元素开始,假定其为最小的值,然后下标从1到arr.length-1处逐个找比下标为0的值小的数,然后重置这个最小的值,再交换!然后接着下一轮!
二、逐步推导选择排序
package sort;
import java.util.Arrays;
public class SelectSort {
//选择排序时间复杂度为O(n2)
public static void main(String[] args){
int arr[] = {101,34, 119, 1};
System.out.println("原始的数组:"+ Arrays.toString(arr));
System.out.println("开始进行选择排序...");
SelectSort(arr);
System.out.println("选择排序完成!!!");
System.out.println("选择排序侯的数组:"+ Arrays.toString(arr));
}
public static void SelectSort(int[] arr){
/**
* 第1轮
*/
//假定索引为0处的值为最小值,即arr[0] = minValue
int minIndex = 0;//假定0处索引对应的值为最小值
int minValue = arr[0];
//遍历查询最小值
for (int j = 0+1;j<arr.length;j++){
if (arr[j] < minValue){
minValue = arr[j];//重置最小值
minIndex = j;//重置索引
}
}
if (minIndex !=0){
//将找到的最小值与arr[0]交换。
arr[minIndex] = arr[0];//arr[0]的值给arr[minIndex]
arr[0] = minValue;//将最小值给arr[0]
}
System.out.println("第一轮排序:"+ Arrays.toString(arr));
/**
* 第2轮
*/
//假定索引为1处的值为最小值,即arr[1] = minValue
minIndex = 1;//假定1处索引对应的值为最小值
minValue = arr[1];
//遍历查询最小值
for (int j = 1+1;j<arr.length;j++){
if (arr[j] < minValue){
minValue = arr[j];//重置最小值
minIndex = j;//重置索引
}
}
if (minIndex != 1){
//将找到的最小值与arr[1]交换。
arr[minIndex] = arr[1];//arr[1]的值给arr[minIndex]
arr[1] = minValue;//将最小值给arr[1]
}
System.out.println("第二轮排序:"+ Arrays.toString(arr));
/**
* 第3轮
*/
//假定索引为2处的值为最小值,即arr[2] = minValue
minIndex = 2;//假定1处索引对应的值为最小值
minValue = arr[2];
//遍历查询最小值
for (int j = 2+1;j<arr.length;j++){
if (arr[j] < minValue){
minValue = arr[j];//重置最小值
minIndex = j;//重置索引
}
}
if (minIndex != 2){
//将找到的最小值与arr[1]交换。
arr[minIndex] = arr[2];//arr[2]的值给arr[minIndex]
arr[2] = minValue;//将最小值给arr[2]
}
System.out.println("第三轮排序:"+ Arrays.toString(arr));
}
}
截图
三、选择排序实现
采用Scanner键入获取所要排序的数组长度和数
package sort;
import java.util.Arrays;
import java.util.Scanner;
public class SelectSort {
//选择排序时间复杂度为O(n^2)
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入排序数组长度:");
int n = scanner.nextInt();
System.out.println("请输入所要排序的数(以enter键结束):");
int[] arr = new int[n];
//依次将每个键入的数,存在arr数组中
for (int i=0 ; i<arr.length;i++){
arr[i] = scanner.nextInt();
}
System.out.println("原始的数组:"+ Arrays.toString(arr));
System.out.println("开始进行选择排序...");
SelectSort(arr);
System.out.println("选择排序完成!!!");
System.out.println("选择排序侯的数组:"+ Arrays.toString(arr));
}
public static void SelectSort(int[] arr){
//执行次数为arr.length-1次
for (int i = 0 ;i<arr.length-1 ; i++){
//假定索引i处的值为最小值,即arr[i] = minValue
int minIndex = i;//假定i处索引对应的值为最小值
int minValue = arr[i];
//遍历查询最小值
for (int j = i+1;j<arr.length;j++){
if (arr[j] < minValue){
minValue = arr[j];//重置最小值
minIndex = j;//重置索引
}
}
if (minIndex !=i){
//将找到的最小值与arr[i]交换。
arr[minIndex] = arr[i];//arr[i]的值给arr[minIndex]
arr[i] = minValue;//将最小值给arr[i]
}
System.out.println("第"+(i+1)+"轮排序:"+ Arrays.toString(arr));
}
}
}
截图