1、相邻数据之间相比较。先是1,0;然后2,1、1,0;以此类推
总结:大for从1~N;小for从i~0,之后判断交换即可
public void chaRuSort() {
int[] a = new int[]{5,4,2,1,3};
for (int i = 1; i < a.length;i++) {
for (int j = i ; j > 0; j--) {//比较相邻的数据
if (a[j] < a[j-1]) {
//交换
int c;
c = a[j-1];
a[j-1] = a[j];
a[j] = c;
}
}
}
}
2、希尔排序是插入排序特殊化,他不再比相邻数据,而是可以比较类似1,4,13…的数据,这样会更快
/**
* 总结---首先获取h
* 之后在插入排序的基础上将1变成h即可
* @param a
*/
public static void shellSort(Comparable[] a) {
int N = a.length;
int h = 1;
while (h < N/3) {
h = 3 * h + 1;//1,4,13,40,121.......循环完成得到h的最大值,设为13
}
while (h >= 1) {
for (int i = h; i < N; i++) {
for (int j = i; j >= h; j = j - h) {//a[13]与a[0]比,退出此循环后;a[14]与a[1]比,再次退出循环;
if (less(a[j], a[j-h])) {
exch(a, j , j-h);
}
}
}
//完成最大的for循环后,h变成4,进而上边的for变成 a[4]与a[0]
h = h/3;
}
}