看算法第四版的希尔排序时,打算把例中的String数组换成int数组,却出现了上面的问题。最后在StackOverflow找到答案
原代码:
package sort; import edu.princeton.cs.algs4.In; public class Shell{ public static void sort(Comparable[] a) { //将a[]升序排列 int N = a.length; int h = 1; while (h<N/3) h = 3*h + 1; // 1,4,13... while (h>=1) { // 数组变为h有序 for (int i=h;i<N;i++) { // 将a[i]插入到a[i-h],a[i-2h]..中 for (int j=i;j>=h&&less(a[j],a[j-h]);j -= h) { System.out.println(a[j]+" "+a[j-h]+less(a[j],a[j-h]));exch(a,j,j-h); for (int k=0;k<N;k++) System.out.print(a[k]+" "); System.out.println(); } } h = h/3; } } private 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; } private static void show(Comparable[] a) { // 单行打印数组,只有本类的静态方法可调用 for (int i=0;i<a.length;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) { // TODO Auto-generated method stub // 从标准输入读取字符串,将它们排序并输出 String[] a = In.readStrings(); sort(a); assert isSorted(a); // 确认有序 show(a); } }
String[] a = In.readStrings()不能改成int[] a = In.readInts(),因为int是原始数据类型,无法实现接口。应该改成Integer[],然而In类没有对应的方法,所以我改成了
int[] in = In.readInts(); Integer[] a = new Integer[in.length]; for (int i=0;i<a.length;i++) a[i]=in[i]; sort(a); assert isSorted(a); // 确认有序 show(a);
测试有效
原文地址:https://www.cnblogs.com/hesfail/p/12357457.html
时间: 2024-10-08 17:47:01