//选择排序
/*
* 找到数组中最小的元素,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么就和它自己交换)
* 在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置
* 如此往复,直到将整个数组排序
*/
package Algorithms;
import java.util.Comparator;
import edu.princeton.cs.algs4.Selection;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class P156_Selection {
private P156_Selection(){}
public static void sort(Comparable[] a){
//将a[]按升序排列
int n = a.length;
for (int i = 0; i < n; i++){
int min = i;
for (int j = i + 1; j < n; j++){
if (less(a[j], a[min])){
min = j;
}
}
exch(a, i, min);
assert isSorted(a, 0, i);
}
assert isSorted(a);
}
public static void sort(Object[] a, Comparator comparator) {
int n = a.length;
for (int i = 0; i < n; i++) {
int min = i;
for (int j = i+1; j < n; j++) {
if (less(comparator, a[j], a[min])) min = j;
}
exch(a, i, min);
assert isSorted(a, comparator, 0, i);
}
assert isSorted(a, comparator);
}
//比较v和w大小
private static boolean less(Comparable v, Comparable w){
return v.compareTo(w) < 0;
}
private static boolean less(Comparator comparator, Object v, Object w){
return comparator.compare(v, w) < 0;
}
//交换a[i]和a[j]
private static void exch(Object[] a, int i, int j){
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
}
//确定是否排好序
private static boolean isSorted(Comparable[] a){
return isSorted(a, 0, a.length - 1);
}
private static boolean isSorted(Comparable[] a, int lo, int hi){
for (int i = lo + 1; i <= hi; i++){
if (less(a[i], a[i - 1])){
return false;
}
}
return true;
}
private static boolean isSorted(Object[] a, Comparator comparator){
return isSorted(a, comparator, 0, a.length - 1);
}
private static boolean isSorted(Object[] a, Comparator comparator, int lo, int hi) {
for (int i = lo + 1; i <= hi; i++)
if (less(comparator, a[i], a[i-1])) return false;
return true;
}
private static void show(Comparable[] a){
for (int i = 0; i < a.length; i++){
StdOut.println(a[i]);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] a = StdIn.readAllStrings();
P156_Selection.sort(a);
show(a);
}
}