• 基本思想:让数组越来越有序
    • 不能只处理相邻的逆序对
    • 有些嵌入式机器不支持递归或者递归要消耗的性能非常大,就可以使用希尔排序。

    image.png
    image.png

    1. private static <E extends Comparable<E>> void sort(E[] data) {
    2. int h = data.length / 2;
    3. while (h >= 1) {
    4. // 遍历每一个子数组,每一个子数组第一个元素的位置为0到h-1
    5. for (int start = 0; start < h; start++) {
    6. for (int i = start + h; i < data.length; i += h) {
    7. E t = data[i];
    8. int j;
    9. // j-h 前一个元素的位置
    10. for (j = i; j - h >= 0 && t.compareTo(data[j - h]) < 0; j -= h) {
    11. data[j] = data[j - h];
    12. }
    13. data[j] = t;
    14. }
    15. }
    16. h = h / 2;
    17. }
    18. }

    image.png

    1. private static <E extends Comparable<E>> void sort2(E[] data) {
    2. int h = data.length / 2;
    3. while (h >= 1) {
    4. for (int i = h; i < data.length; i++) {
    5. E t = data[i];
    6. int j;
    7. // j-h 前一个元素的位置
    8. for (j = i; j - h >= 0 && t.compareTo(data[j - h]) < 0; j -= h) {
    9. data[j] = data[j - h];
    10. }
    11. data[j] = t;
    12. }
    13. h = h / 2;
    14. }
    15. }