选择排序算法的实现(Java 版)
原理
-
将数组(链表)中的数据分为两个区间:
已排序区间和未排序区间
。初始已排序区间没有元素
。 -
选择排序每次会
从未排序区间中找到最小(最大)的元素
,将其放到已排序区间的末尾
,保证已排序区间的数据一直有序。 -
重复这个过程,直到
未排序区间中元素只剩一个
,算法结束。
图示
代码
public class SelectionSort {
/**
* 将 int[] 进行排序(整数排序)
* <p>
* 升序
*
* @param a int[]
*
* @return int[]
*/
public static int[] sortAsc(int[] a) {
for(int i = 0; i < a.length; i++) {
for(int j = i + 1; j < a.length; j++) {
int tmp = i;
if(a[tmp] > a[j]) {
tmp = j;
}
// 将待排序区找到的最小的元素与待排序区第一个元素交换
exchange(a, i, tmp);
}
}
return a;
}
/**
* 将 int[] 进行排序(整数排序)
* <p>
* 降序
*
* @param a int[]
*
* @return int[]
*/
public static int[] sortDesc(int[] a) {
for(int i = 0; i < a.length; i++) {
for(int j = i + 1; j < a.length; j++) {
int tmp = i;
if(a[tmp] < a[j]) {
tmp = j;
}
// 将待排序区找到的最小的元素与待排序区第一个元素交换
exchange(a, i, tmp);
}
}
return a;
}
/**
* 交换方法,交换 int 数组中的元素(基本数据类型)
*
* @param array 数组
* @param a 下标一
* @param b 下标二
*/
private static void exchange(int[] array, int a, int b) {
int tmp = array[a];
array[a] = array[b];
array[b] = tmp;
}
}
分析
-
外层循环表示循环的次数
,内层循环用来找出最大(最小)的元素
。 -
将目标元素放到已排序区后(待排序区第一个)
即可,不需要额外操作。 -
排序算法中,
传入的数组,和排序后返回的数组 是同一个
,返回值不是必备的。 -
找 目标元素是最费时的。
-
注意:
选择排序和直接插入排序两者
,直接插入排序要略优于选择排序
。