选择排序的优化

博客介绍

选择排序是一种基础的排序方法,在数组中找到最小的元素与第一个元素交换位置,在剩下的元素中继续进行同样的操作,但在运行过程中的时间效率还是有所欠缺所以对其进行优化。

选择排序源代码

作者:

public class Selection {
public static void sort(Comparable[ ] arr) {
int length = arr.length;//数组长度
for (int indexI = 0; indexI < length; indexI++) {
//将arr[indexI]和arr[indexI+1...length]中最小的元素交换
int min = indexI;//最小元素的索引
for (int indexJ = indexI + 1; indexJ < length; indexJ++) {
if (less(arr[indexJ], arr[min])) {
min = indexJ;
}
}
exch(arr, indexI, min);
}
}

private static boolean less(Comparable comparableA, Comparable comparableB) {
return comparableA.compareTo(comparableB) < 0;
}

private static void exch(Comparable[ ] arr, int indexI, int indexJ) {
Comparable temp = arr[indexI];
arr[indexI] = arr[indexJ];
arr[indexJ] = temp;
}

private static void show(Comparable[ ] arr) {
for (int index = 0; index < arr.length; index++) {
System.out.print(arr[index] + " ");
}
System.out.println();
}


public static boolean isSort(Comparable[ ] arr) {
for (int index = 1; index < arr.length; index++) {
if (less(arr[index], arr[index - 1])) {
return false;
}
}
return true;
}

public static void main(String[] args) {
Integer[] arr = new Integer[]{14, 23, 21, 17, 20, 49, 24, 77, 54, 47, 31};
sort(arr);
assert isSort(arr);
show(arr); //14 17 20 21 23 24 31 47 49 54 77
}
}
性能分析

交换元素的代码写在内循环之外,每次交换都能排定一个元素,因此交换的总次数是N。所以算法的时间效率取决与比较次数。对于长度为N的数组需要N²/2比较和N次交换。

优化方案

在每次遍历剩余元素时找到最小值与最大值并将其排定,这样遍历次数会减少一半,消耗时间也会相应的减少。

优化代码

public static void sortPlus(Comparable[ ] arr) {
for (int left = 0, right = arr.length - 1; left < right; left++, right--) {
int min = left;
int max = right;
for (int index = left; index <= right; index++) {
if (less(arr[index], arr[min])) {
min = index;
}
if (less(arr[max], arr[index])) {
max = index;
}
}
exch(arr, left, min);
if (left == max) {
max = min;
}
exch(arr, right, max);
}
}

总结

虽然优化方案我目前只应用在了选择排序上,但在其他的一些排序算法上也能使用,在过程中通过对他人程序的阅读也对自己有所提升。

posted @ 2021-03-09 22:11  唐承柯  阅读(218)  评论(0编辑  收藏  举报