选择排序
选择排序的基本思想是:从选择表中最小的项并将其移至表的最前面开始。 然后选择表中的剩余项中的最小项,同时将其放到表的第二个位置。 通过重复从表的剩余部分选择最小的项,经过排序的部分便从前往后逐渐变长,而后面未排序的部分逐渐缩短。 最后,表中所有项都由大到小按次序排列了。
分析: 如果表有 n 项, 那么第一遍选择出最小项,放到表的最前, 然后第二遍,从剩余的项中选择出最小项,放到表的第二个位置,那么我们要筛选 n - 1 遍,让表的倒数第二个位置得到剩余项的最小值,那么自然而然,表就排好了。 那么每一遍的任务,就是从剩余项中选择出最小项。 由此写出伪代码。
伪代码:
P 取值为 1. (表示表的第一项)
while (P <= n - 1)
//要让第 P 项取得最小值。
min 取值为 第P项的值;
N 取值为 P+1;
while (N <= n)
if (第 N 项的值 < min)
index 变量记下 N 的值;
N = N + 1;
交换第 P 项和 第 index 项的值。
P = P + 1;
public class SelectSort { public static void main(String[] args) { int p = 0; int n, index; int[] a = {21, 8, 7, 88, 5, 20, 3, 22, 55, 99}; int min; while (p < a.length - 1) { //假设 a[p] 是最小项。 min = a[p]; index = p; //使得 a[p] 是最小项。 n = p + 1; while (n < a.length) //n 的范围从 p+1 到 a.length - 1. { if (a[n] < min) { min = a[n]; index = n; //将 n 保存下来 } n = n + 1; } //交换 a[index] 和 a[p] 的值, 这样就使得 a[p] 真正成为最小项。 int temp = a[index]; a[index] = a[p]; a[p] = temp; //p 递增。 p = p + 1; } //打印 数组。 for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } }
我们用 for 循环代替 while 循环,显得更紧凑一点,然后把得到最小项的过程和交换数值的过程封装成方法进行调用, 得到下面的方法:
public class SelectSort { public static void main(String[] args) { int[] a = {1, 21, 8, 7, 88, 5, 20, 3, 22, 55, 99}; //选择排序方法。 selectSort(a); //打印 数组。 for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } public static void selectSort (int[] array) { int p; int index = 0; for (p = 0; p < array.length - 1; p++) { //得到数组中最小值的下标。 index = getSmallest(array, p); //交换 a[index] 和 a[p] 的值, 这样就使得 a[p] 真正成为最小项。 exchange(array, index, p); } } private static int getSmallest (int[] array, int position) { //假设 a[p] 是最小项。 int min = array[position]; int index = position; //使得 a[p] 成为真正的最小项。 int n; for (n = position + 1; n < array.length; n++) { if (array[n] < min) { min = array[n]; index = n; //将 最小值的下标 n 保存下来。 } } return index; } private static void exchange (int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } }