选择排序
选择排序就是对于N个数,将其分为N-1次任务,每次任务从第K(从0开始)个数开始处理,如果在剩下的N-K个数中有比自己大(小)的则记录下标,等到每次任务执行完毕的时候,如果下标不是当前K的位置,则进行交换处理。
举个例子
有一个数组: 3 2 6 8 1
第一次任务: 1 2 6 8 3
第二次任务: 1 2 6 8 3
第三次任务: 1 2 3 8 6
第四次任务: 1 2 3 6 8
代码实现
public class SelectionSort {
/**
* 选择排序,就是每次都从剩余元素中选中一个最小(大)的放在剩余元素的起始(终止)位置,
* 经历N-1次处理整个数组是有序的
*/
public static int[] selectionSort(int[] arr) {
int index; //记录剩余元素中最小元素的下标
int len = arr.length;
for (int i = 0; i < len - 1; i++) {
index = i;
//i + 1 目的在于无需跟自己进行比较
for (int j = i + 1; j < len; j++) {
//在剩余数中寻找比当前小的数
if (arr[index] > arr[j]) {
index = j;
}
}
//当找到了比当前元素小的数时,进行交换,否则无需交换
if (index != i) {
swap(arr, index, i);
}
}
return arr;
}
//交换算法
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
Random r = new Random();
int[] arr = new int[20];
for (int i = 0; i < arr.length; i++) {
arr[i] = r.nextInt(100);
}
//未排序
System.out.printf("排序前:%s \n", Arrays.stream(arr).boxed().map(Object::toString).collect(Collectors.joining(" ")));
//排好序
System.out.printf("排序前:%s \n", Arrays.stream(selectionSort(arr)).boxed().map(Object::toString).collect(Collectors.joining(" ")));
}
}
运行结果
排序前:75 25 10 17 81 31 48 4 75 7 17 74 29 29 53 12 10 86 21 39
排序后:4 7 10 10 12 17 17 21 25 29 29 31 39 48 53 74 75 75 81 86