diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 0c46b40..2b70387 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -279,21 +279,7 @@ - - - - 1581858072286 - - - 1581858428131 - 1581954761859 @@ -624,7 +610,21 @@ - + @@ -711,16 +716,16 @@ - + - - + + - + @@ -787,11 +792,11 @@ - + - + @@ -810,11 +815,11 @@ - + - + diff --git a/Rocket.md b/Rocket.md index 474124d..58dfd49 100644 --- a/Rocket.md +++ b/Rocket.md @@ -839,7 +839,50 @@ void quick_sort(int a[], int low, int high){ } ``` -5. 堆排序:假设序列有n个元素,先将这n建成大顶堆,然后取堆顶元素,与序列第n个元素交换,然后调整前n-1元素,使其重新成为堆,然后再取堆顶元素,与第n-1个元素交换,再调整前n-2个元素...直至整个序列有序。 +5. 堆排序:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。 +```java +public class Test { + + public void sort(int[] arr) { + for (int i = arr.length / 2 - 1; i >= 0; i--) { + adjustHeap(arr, i, arr.length); + } + for (int j = arr.length - 1; j > 0; j--) { + swap(arr, 0, j); + adjustHeap(arr, 0, j); + } + + } + + public void adjustHeap(int[] arr, int i, int length) { + int temp = arr[i]; + for (int k = i * 2 + 1; k < length; k = k * 2 + 1) { + if (k + 1 < length && arr[k] < arr[k + 1]) { + k++; + } + if (arr[k] > temp) { + arr[i] = arr[k]; + i = k; + } else { + break; + } + } + arr[i] = temp; + } + + public void swap(int[] arr, int a, int b) { + int temp = arr[a]; + arr[a] = arr[b]; + arr[b] = temp; + } + + public static void main(String[] args) { + int[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1}; + new Test().sort(arr); + System.out.println(Arrays.toString(arr)); + } +} +``` 6. 希尔排序:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时再对全体记录进行一次直接插入排序。 7. 归并排序:把有序表划分成元素个数尽量相等的两半,把两半元素分别排序,两个有序表合并成一个