堆排序
    java

    1. public static void heapSort(int[] arr) {
    2. int len = arr.length;
    3. // 1. 构建大顶堆
    4. for (int i = len / 2 - 1; i >= 0; i --) {
    5. // 从倒数第一个非叶子结点从下至上,从右至左调整结构
    6. heapAdjust(arr, i, len);
    7. }
    8. // 2. 每一趟排序,都将大顶堆的堆顶与数组的索引j处的值交换
    9. // 索引j最开始指向数组尾部,随着每一趟排序的结束自减,直到指向数组头部
    10. for (int j = len - 1; j > 0; j--) {
    11. int tmp = arr[0];
    12. arr[0] = arr[j];
    13. arr[j] = tmp;
    14. heapAdjust(arr, 0, j);
    15. }
    16. }
    17. public static void heapAdjust(int[] arr, int i, int len) {
    18. // 记录传入节点值
    19. int tmp = arr[i];
    20. // 从i节点的左子节点开始,即i*2+1
    21. for (int k = 2 * i + 1; k < len; k = 2 * k + 1) {
    22. // 当左子节点小于右子节点,则让父节点与右子节点相比
    23. if (k + 1 < len && arr[k] < arr[k+1]) {
    24. k++;
    25. }
    26. // 若最大的子节点比传入节点大,则将最大的子节点的位置移到传入节点上
    27. if (arr[k] > tmp) {
    28. arr[i] = arr[k];
    29. i = k;
    30. } else {
    31. break;
    32. }
    33. }
    34. // 传入节点值放在最终的位置
    35. arr[i] = tmp;
    36. }

    go

    1. func heapSort(arr []int) {
    2. l := len(arr)
    3. // 1. 构建大顶堆
    4. for i := l / 2 - 1; i >= 0; i-- {
    5. // 从最后一个非叶子节点,从下至上,从右至左调整结构
    6. heapAdjust(arr, i, l)
    7. }
    8. // 2. 每一趟排序,都将大顶堆堆顶与数组的索引j处的值交换
    9. for j := l - 1; j > 0; j-- {
    10. arr[0], arr[j] = arr[j], arr[0]
    11. heapAdjust(arr, 0, j)
    12. }
    13. }
    14. func heapAdjust(heap []int, i int, l int) {
    15. // 记录传入的节点值
    16. tmp := heap[i]
    17. // 从i的左子节点开始
    18. for k := 2 * i + 1; k < l; k = k * 2 + 1 {
    19. // 当左子节点小于右子节点,则让父亲节点与右子节点相比较
    20. if k + 1 < l && heap[k] < heap[k + 1] {
    21. k++
    22. }
    23. if heap[k] > tmp {
    24. heap[i] = heap[k]
    25. i = k
    26. } else {
    27. break
    28. }
    29. }
    30. // 传入节点值最终放在的位置
    31. heap[i] = tmp
    32. }

    归并排序
    java

    1. public static void mergeSort(int[] arr, int left, int right) {
    2. if (left < right) {
    3. int mid = left + (right - left) / 2;
    4. mergeSort(arr, left, mid);
    5. mergeSort(arr, mid + 1, right);
    6. }
    7. }
    8. public static void merge(int[] arr, int left, int mid, int right) {
    9. int[] tmpArr = new int[right - left + 1];
    10. int index = 0;
    11. int i = left, j = mid + 1;
    12. while (i <= mid && j < right) {
    13. tmpArr[index++] = (arr[i] <= arr[j] ? arr[i++] : arr[j++]);
    14. }
    15. while (i <= mid) tmpArr[index++] = arr[i++];
    16. while (j <= right) tmpArr[index++] = arr[j++];
    17. for (int val : tmpArr) {
    18. arr[left++] = val
    19. }
    20. }

    go

    1. func mergeSort(arr []int, left, right int) {
    2. if left < right {
    3. mid := left + (right - left) / 2
    4. mergeSort(arr, left, mid)
    5. mergeSort(arr, mid + 1, right)
    6. merge(arr, left, mid, right)
    7. }
    8. }
    9. func merge(arr []int, left, mid, right int) {
    10. tmpArr := make([]int, right - left + 1)
    11. index := 0
    12. i := left
    13. j := mid + 1
    14. for i <= mid && j <= right {
    15. if arr[i] < arr[j] {
    16. tmpArr[index] = arr[i]
    17. i++
    18. } else {
    19. tmpArr[index] = arr[j]
    20. j++
    21. }
    22. index++
    23. }
    24. for i <= mid {
    25. tmpArr[index] = arr[i]
    26. i++
    27. index++
    28. }
    29. for j <= right {
    30. tmpArr[index] = arr[j]
    31. j++
    32. index++
    33. }
    34. for idx, val := range tmpArr {
    35. arr[left + idx] = val
    36. }
    37. }

    补充题4.
    手撕快速排序
    java

    1. public static void quickSort(int[] arr, int low, int high) {
    2. int p, i, j, temp;
    3. if (low >= high) {
    4. return;
    5. }
    6. p = arr[low];
    7. i = low;
    8. j = high;
    9. while (i < j) {
    10. while (i < j && arr[j] >= p) {
    11. j--;
    12. }
    13. while (i < j && arr[i] <= p) {
    14. i++;
    15. }
    16. temp = arr[j];
    17. arr[j] = arr[i];
    18. arr[i] = temp;
    19. }
    20. arr[low] = arr[i];
    21. arr[i] = p;
    22. quickSort(arr, low, i - 1);
    23. quickSort(arr, i + 1, high);
    24. }

    go

    1. func quickSort(arr []int, left, right int) {
    2. if left >= right {
    3. return
    4. }
    5. i := left
    6. j := right
    7. p := arr[left]
    8. for i < j {
    9. for i < j && arr[j] >= p {
    10. j--
    11. }
    12. for i < j && arr[i] <= p {
    13. i++
    14. }
    15. arr[i], arr[j] = arr[j], arr[i]
    16. }
    17. arr[left], arr[i] = arr[i], arr[left]
    18. quickSort(arr, left, i - 1)
    19. quickSort(arr, i + 1, right)
    20. }
    1. 反转链表 7
      java

      1. /**
      2. * Definition for singly-linked list.
      3. * public class ListNode {
      4. * int val;
      5. * ListNode next;
      6. * ListNode() {}
      7. * ListNode(int val) { this.val = val; }
      8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
      9. * }
      10. */
      11. class Solution {
      12. public ListNode reverseList(ListNode head) {
      13. ListNode pre = null;
      14. ListNode cur = head;
      15. while (cur != null) {
      16. ListNode next = cur.next;
      17. cur.next = pre;
      18. pre = cur;
      19. cur = next;
      20. }
      21. return pre;
      22. }
      23. }

      go

      1. /**
      2. * Definition for singly-linked list.
      3. * type ListNode struct {
      4. * Val int
      5. * Next *ListNode
      6. * }
      7. */
      8. func reverseList(head *ListNode) *ListNode {
      9. var pre *ListNode
      10. cur := head
      11. for cur != nil {
      12. next := cur.Next
      13. cur.Next = pre
      14. pre = cur
      15. cur = next
      16. }
      17. return pre
      18. }
    2. 二分查找 6
    1. class Solution {
    2. public int search(int[] nums, int target) {
    3. int pivot, left = 0, right = nums.length - 1;
    4. while (left <= right) {
    5. pivot = left + (right - left) / 2;
    6. if (target == nums[pivot]) return pivot;
    7. else if (target < nums[pivot]) right = pivot - 1;
    8. else left = pivot + 1;
    9. }
    10. return -1;
    11. }
    12. }

    go

    1. func search(nums []int, target int) int {
    2. left := 0
    3. right := len(nums) - 1
    4. for left <= right {
    5. pivot := left + (right - left) / 2
    6. if target == nums[pivot] {
    7. return pivot
    8. } else if target < nums[pivot] {
    9. right = pivot - 1
    10. } else {
    11. left = pivot + 1
    12. }
    13. }
    14. return -1
    15. }
    1. 字符串相加 6
    1. 二叉树的层序遍历 5

    2. 用 Rand7() 实现 Rand10() 5

    3. 最大子序和 4

    4. 寻找两个正序数组的中位数 4

    5. 环形链表