选择排序
定义
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。
分析
对于长度为 N 的数组,选择排序需要大约 N²/2 次比较和 N 次交换。
代码实现
package com.ttpfx.sorting;
import edu.princeton.cs.algs4.StdIn;
public class Selection {
public static void sort(Comparable[] a) {
int length = a.length;
for (int i = 0; i < length; i++) {
int minIndex = i;
for (int j = i + 1; j < length; j++) {
if (less(a[j], a[minIndex])) {
minIndex = j;
}
}
if (i != minIndex) {
exch(a, i, minIndex);
}
}
}
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a, int i, int j) {
Comparable temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private static void show(Comparable[] a) {
for (Comparable item : a) {
System.out.print(item + " ");
}
System.out.println();
}
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
if (!less(a[i-1], a[i])) {
return false;
}
}
return true;
}
public static void main(String[] args) {
String[] a = StdIn.readAllStrings();
sort(a);
assert isSorted(a);
show(a);
}
}
浙公网安备 33010602011771号