选择排序
选择排序,可以说是所有排序中最为简单的一种方式,选择排序的原理就是,把所有数中最小的数挑出来放在第一个位置,然后不再考虑第一个数,剩下的数中再将最小的挑出来放在第一个位置,以此类推,这样我们便可以将一列数进行排序了,这种算法非常的简单,我们今天想说的不仅仅是算法的实现,也是整个排序和代码的艺术性的实现,下面让我们看一下我们的代码:
package paixu;
import java.nio.file.Watchable;
public class Example {
public static void sort(Comparable[] 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);
}
}
}
public static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.println(a[i] + " ");
System.out.println();
}
}
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++)
if (less(a[i], a[i - 1]))
return false;
return true;
}
public static void main(String[] args) {
String[] a = "B,D,C,A,E,G,F, ".split(",");
sort(a);
assert isSorted(a);
show(a);
}
}
当然根据我们的代码,可想而知我们的输出的结果是按照顺序排好的A,B,C,D,E,F,G,我们这里并不是单纯的把所有代码都罗列到主函数里面,这里面用到的函数的类的思想非常的明显,这样写的好处是,如果我们想实现其它排序的话只需要非常简单的修改一点代码即可。
我们的less函数,返回的值是一个boolean类型的数值,这里面用到了一个comparable的函数,此方法如果这个字符串是等参数字符串那么返回值0,如果这个字符串是按字典顺序小于字符串参数那么返回小于0的值,如果此字符串是按字典顺序大于字符串参数那么一个大于0的值。
我们的exch函数的目的是为了判断的,是用来将两个数据的值进行交换的。
我们的show函数的目的是,将排序好的数组输出在屏幕上面。
我们的isSorted是一个判断,用来判断我们的排序是否成功的,如果我们的排序成功了,那么将返回一个true,如果排序失败了,那么我们将返回一个false。
我们的sort函数就是我们选择排序的关键所在了,采用两个for循环来实现,外层的for循环是控制位置的,内层的for循环是用来决定这个数值是不是剩下数值中最小的,如果是最小的,就把它换到一个位置去。
我们的main函数中我们创建了一个string类型的数组,是将一个字符串通过split的方式变成的string类型的数组,然后调用我们的排序的方法,下面我们还涉及到一个重点就是断言的方法,也就是说,如果我们断言后面返回的是真的话,那么我们就执行下面的操作,也就是输出我们的结果,如果我们发现排序失败了,那么我们的断言将会起作用,这个时候我们会抛出一个异常,也就不会有结果的输出了。