回顾常见的排序算法,通过编码发现容易出错的地方,特意在此记录下来,便于下次回顾的时候,出现错误能够快速定位。
常见的排序算法有四类:
下面依次说明算法中的容错点。
每次选择较大值,还是选择较小值,写法上略微有些不同。
表面是对角标范围[1,n-1]
进行对排序,实际上exch(T[] a, int i, int j)
和less(T[] a, int i, int j)
都要错一位进行计算。
public boolean less(T[] a, int i, int j) {
return a[i-1].compareTo(a[j-1])<0;
}
public void exch(T[] a, int i, int j) {
T t = a[i-1];
a[i-1] = a[j-1];
a[j-1] = t;
}
注意两层遍历的角标。
for (int i=0; i<a.length-1; i++) {
for (int j=1; j<a.length-i; j++) {
//......
}
}
采用递归写法
采用递推。
第二层的遍历需要注意:
for (int i=1; i<a.length; i++) {
T t = a[i];
int j = i;
for (; j>=1 && less(t, a[j-1]); j--) {
//...
}
}
基于插入排序,注意,第二层循环的判断。
递推
递归。