选择排序详解
思路分析
- 选择排序,即选择数组中最小或者最大的数(取决于你要顺序排列还是降序排列)和数组中最前边的元素交换位置
- 第一次循环将最小的元素放置到数组的最前边,及最小元素和第一个元素交换位置,第二次循环将倒数第二小的元素放置到数组第二个位置,及倒数第二小元素和第二个元素交换位置,以此类推
- 则在进行 len - 1 次循环后,所有的元素都排好序
- 外层循环每次将最小的元素向前移动,内层循环则寻找最小的数,并完成交换,从当前已经排好序的有一个元素开始执行
- 选择排序的时间复杂度为 n ^ 2,但是每次循环执行的语句较少,执行效率比冒泡快很多
- 源码及解析如下
源码及分析
/**
* 选择排序
* @param arr 要排序的数字
*
* 每次将数组中最小的元素拿出来放到最前边
*
*/
public static void selectSort(int[] arr){
//外层循环 len - 1 次,每次将最小的元素移动到最前
for (int i = 0; i < arr.length - 1; i++) {
//定义变量min保存当前次循环的最小值,
int min = arr[i];
//定义minIndex保存当前次循环最小值对应的索引
int minIndex = i;
//内层循环遍历当前元素右侧的数据,找到最小值
for (int j = i + 1; j < arr.length ; j++) {
if (min > arr[j]){
//如果当前数小于min,则记录值并记录其索引
min = arr[j];
minIndex = j;
}
}
//交换位置,即将最小的数移动的前边
if (minIndex != i) {
arr[minIndex] = arr[i];
arr[i] = min;
}
}
}