排序算法
算法(第四版)
排序模板
public class Example {
/*排序算法*/
public static void sort(Comparable[] a) {
}
/*比较两个数的大小*/
private static boolean less(Comparable v, Comparable w) {
//System.out.println("a".compareTo("b"));//-1 ==> -1 < 0 true
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;
}
/*打印数组*/
private static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(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 = {"a", "d", "m", "c", "x", "e"};
System.out.print("排序前:");
show(a);
sort(a);
assert isSorted(a);
System.out.print("排序后:");
show(a);
}
}
选择排序
public static void sort(Comparable[] a) {
//获取数组长度
int s = a.length;
for (int i = 0; i < s; i++) {
//每次i都为剩余要排序数组的第一个下标索引
int min = i;
for (int j = i + 1; j < s; j++) {
//min存储最小值的下标
if (less(a[j], a[min])) {
min = j;
}
}
//获取索引以i+1开始的数组的最小值索引与i的索引进行交换
exch(a, i, min);
}
}
插入排序
public static void sort(Comparable[] a) {
//获取数组长度
int s = a.length;
//外层循环将a[]数组按升序排序
for (int i = 1; i < s; i++) {
//内层循环将新的下标对应的值插入到正确的位置
for (int j = i; j > 0 && less(a[j], a[j-1]); j--) {
exch(a, j, j - 1);
}
}
}
希尔排序
public static void sort(Comparable[] a) {
//获取数组长度
int s = a.length;
int h = 1;
//扩大h的步长
while (h < s) {
h = 3 * h + 1;// 1, 4, 13, 40, 121, 364, 1093,···
}
while (h >= 1) {
//按照h的大小对整个数组进行分段,然后排序,使每个分组内都是有序的
for (int i = h; i < s; i++) {
for (int j = i; j > 0 && less(a[j], a[j - h]); j -= h) {
exch(a, j, j - h);
}
}
//减小h的步长,当h=1时,希尔排序相当于选择排序
h /= 3;
}
}