一:基本思想
从第一个元素开始遍历到最后一个元素,找出最大(最小)的元素,然后将这个元素与第一个元素交换位置。然后再从第二个元素开始向后遍历到最后一个元素,找出第二个元素到最后一个元素区间之内的最大(最小)的值,然后与第二个元素交换位置,依次重复这个过程到最后一个元素,可以得到一个有序序列。
二:算法分析
对于选择排序来说,不论数组是如何变化的,比较的次数是不会变的。
比较交换次数=数组长度-1
时间复杂度=O(n2)
三:举例 (从小到大排序)
数组为 int arr[]={8,3,6,7,1,2};
选择排序比较外层循环次数=6-1=5次
第一趟排序:
遍历所有的元素找出最小的元素与第一个元素交换,1和8交换位置
排序结果 1 3 6 7 8 2
第二趟排序(第二次排序遍历的数组用的是第一趟排序出来的数组)
遍历第二个元素到最后一个元素,找最小值与第二个值交换位置
排序结果 1 2 6 7 8 3
以此方式类推
第三趟排序结果 1 2 3 7 8 6
第四趟排序结果 1 2 3 6 8 7
第五趟排序结果 1 2 3 6 7 8
四:编程实现
import java.util.Arrays;
public class SelectSort {
public static void main(String[] args) {
//定义一个数组
int arr[]={8,3,6,7,1,2};
selectSort1(arr);
}
public static void selectSort1(int[] arr){
//定义外层循环控制比较查找最小值的次数
for (int i = 0; i < arr.length-1; i++) {
int minIndex=i;//假定最小数是第一个数
int min=arr[i];//假定最小序号也是第一个数的序号
//从当前数下一位开始依次进行比较,查找最小的数,
// 如果判断第 i 位不是最小的数,将 i 与 arr.length 之间最小的数与第 i 位交换
for (int j = i+1; j <arr.length ; j++) {
if(min >= arr[j]){
min=arr[j];//最小值换成信排查出来的最小值
minIndex=j;//最小值序号换成信排查出来的值
}
}
//最小的值和当前的值进行交换
arr[minIndex]=arr[i];
arr[i]=min;
System.out.println("第"+(i+1)+"次结果:"+ Arrays.toString(arr));
}
}
}
结果值查看
排序前[8, 3, 6, 7, 1, 2]
第1次排序后:[1, 3, 6, 7, 8, 2]
第2次排序后:[1, 2, 6, 7, 8, 3]
第3次排序后:[1, 2, 3, 7, 8, 6]
第4次排序后:[1, 2, 3, 6, 8, 7]
第5次排序后:[1, 2, 3, 6, 7, 8]
排序后[1, 2, 3, 6, 7, 8]