选择排序
基本思想:
第一次从arr[O]~arr[n-1]中选取最小值,与arr[0]交换,第二次从 arr[1]arr[n-l]中选取最小值,与arr[1]交换,第三次从arr[2]arr[n-1]中选取最小值,与arr[2交换,…,第i次从arr[i-l]~arr[n-1]中选取最小值,与arr[i-1]交换,…,第n-1次从 arr[n-2]~arr[n-1]中选取最小值.与arr[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
示例代码:
public class SelectionSort {
private static int[] arr = {5, -8, 6, 25, -74, 10, 0, 4};
private static int loc;//每次遍历,得到最小值的索引
private static int min = Integer.MAX_VALUE;
public static void main(String[] args) {
for (int i = 0; i < arr.length; i++){
for (int j = i; j < arr.length; j++){
if (min >= arr[j]){
min = arr[j];
loc = j;
}
}
arr[loc] = arr[i];
arr[i] = min;
min = Integer.MAX_VALUE;
}
for (int a : arr){
System.out.println(a);
}
}
}
优化思路:在原始选择排序中,我们每次遍历都是找到最小值,然后再遍历剩余的元素。我们这样,在每次遍历寻找最小值的时候,同时也找到最大值。将最小值放到最左端,将最大值放到最右端。原本的时间复杂度是O(n²),通过这样改进之后,虽然时间复杂度任然是O(n²),但是遍历的趟数会变成原来的1/2,每次遍历的元素也随着趟数增加而变为1/2
优化代码:
public class SelectionSort {
private static int[] arr = {5, -8, 6, 25, -74, 10, 0, 4,18};
private static int min_loc;//每次遍历,得到最小值的索引
private static int max_loc;//每次遍历,得到最大值的索引
private static int min = Integer.MAX_VALUE;//最小值标识
private static int max = Integer.MIN_VALUE;//最大值标识
public static void main(String[] args) {
for (int i = 0; i < (arr.length/2); i++){
for (int j = i; j < arr.length-i; j++){
if (min >= arr[j]){//如果某个数比最小值小
min = arr[j];
min_loc = j;
}
if (max < arr[j]){//如果某个数比最大值大
max = arr[j];
max_loc = j;
}
}
//给最小值换位置
arr[min_loc] = arr[i];
arr[i] = min;
min = Integer.MAX_VALUE;
//给最大值换位置
arr[max_loc] = arr[arr.length-1-i];
arr[arr.length-1-i] = max;
max = Integer.MIN_VALUE;
}
for (int a : arr){
System.out.println(a);
}
}
}