|
| 1 | +package sorts; |
| 2 | + |
| 3 | +/** |
| 4 | + * 向下冒泡算法 (或许比冒泡更易懂的排序算法?) |
| 5 | + * 希尔排序 |
| 6 | + * |
| 7 | + * Author: wliu |
| 8 | + */ |
| 9 | +public class SortsAddOn { |
| 10 | + |
| 11 | + public static void main(String[] args) { |
| 12 | + int[] arr = {3, 2, 6, 4, 5, 1, 9, 20, 13, 16}; |
| 13 | + // bubbleDownSort(arr); |
| 14 | + shellSort(arr); |
| 15 | + print(arr); |
| 16 | + } |
| 17 | + |
| 18 | + /** |
| 19 | + * 向下冒泡。可能比冒泡更易懂? |
| 20 | + * |
| 21 | + * 算法概要: |
| 22 | + * 从0开始,用这个元素去跟后面的所有元素比较,如果发现这个元素大于后面的某个元素,则交换。 |
| 23 | + * 3 2 6 4 5 1 |
| 24 | + * 第一趟是从 index=0 也就是 3, 开始跟index=1及其后面的数字比较 |
| 25 | + * 3 大于 2,交换,变为 2 3 6 4 5 1,此时index=0的位置变为了2 |
| 26 | + * 接下来将用2跟index=2比较 |
| 27 | + * 2 不大于 6 不交换 |
| 28 | + * 2 不大于 4 不交换 |
| 29 | + * 2 不大于 5 不交换 |
| 30 | + * 2 大于 1,交换,变为 1 3 6 4 5 2,第一趟排序完成。 |
| 31 | + * |
| 32 | + * 第二趟是从 index=1 也就是 3,开始跟index=2及其后面的数字比较 |
| 33 | + * 3 不大于 6 不交换 |
| 34 | + * 3 不大于 4 不交换 |
| 35 | + * 3 不大于 5 不交换 |
| 36 | + * 3 大于 2,交换,变为 1 2 6 4 5 3,第二趟排序完成。 |
| 37 | + * |
| 38 | + * 第三趟是从 index=2 也就是 6,开始跟index=3及其后面的数字比较 |
| 39 | + * 6 大于 4,交换,变为 1 2 4 6 5 3, 此时 index = 2 的位置变为了4 |
| 40 | + * 接下来将用4跟index=4比较 |
| 41 | + * 4 不大于 5 不交换 |
| 42 | + * 4 大于 3,交换,变为 1 2 3 6 5 4,第三趟排序完成。 |
| 43 | + * |
| 44 | + * 第四趟是从 index=3 也就是 6,开始跟index=4及其后面的数字比较 |
| 45 | + * 6 大于 5,交换,变为 1 2 3 5 6 4, 此时 index = 3 的位置变为了5 |
| 46 | + * 接下来将用5跟index=5比较 |
| 47 | + * 5 大于 4,交换,变为 1 2 3 4 6 5, 第四趟排序完成。 |
| 48 | + * |
| 49 | + * 第五趟是从 index=4 也就是 6,开始跟index=5及其后面的数字比较 |
| 50 | + * 6 大于 5,交换,变为 1 2 3 4 5 6, 此时 index = 4 的位置变为了5 |
| 51 | + * 接下来将用5跟index=6比较 |
| 52 | + * index = 6 已经不满足 index < length 的条件,整个排序完成。 |
| 53 | + */ |
| 54 | + private static void bubbleDownSort(int[] arr) { |
| 55 | + int len = arr.length; |
| 56 | + if (len == 1) return; |
| 57 | + |
| 58 | + for (int i = 0; i < len; i++) { |
| 59 | + for (int j = i + 1; j < len; j++) { |
| 60 | + if (arr[i] > arr[j]) { |
| 61 | + int tmp = arr[i]; |
| 62 | + arr[i] = arr[j]; |
| 63 | + arr[j] = tmp; |
| 64 | + } |
| 65 | + } |
| 66 | + } |
| 67 | + } |
| 68 | + |
| 69 | + |
| 70 | + private static void shellSort(int[] arr) { |
| 71 | + int len = arr.length; |
| 72 | + if (len == 1) return; |
| 73 | + |
| 74 | + int step = len / 2; |
| 75 | + while (step >= 1) { |
| 76 | + for (int i = step; i < len; i++) { |
| 77 | + int value = arr[i]; |
| 78 | + int j = i - step; |
| 79 | + for (; j >= 0; j -= step) { |
| 80 | + if (value < arr[j]) { |
| 81 | + arr[j+step] = arr[j]; |
| 82 | + } else { |
| 83 | + break; |
| 84 | + } |
| 85 | + } |
| 86 | + arr[j+step] = value; |
| 87 | + } |
| 88 | + |
| 89 | + step = step / 2; |
| 90 | + } |
| 91 | + } |
| 92 | + |
| 93 | + private static void print(int[] arr) { |
| 94 | + System.out.println("Print array:"); |
| 95 | + for (int x : arr) { |
| 96 | + System.out.print(x + "\t"); |
| 97 | + } |
| 98 | + System.out.println(""); |
| 99 | + } |
| 100 | +} |
0 commit comments