lintcode-solutions
  • LintCode 刷题笔记
  • 课程笔记
    • Backtracking
    • Binary Search
    • Divide & Conquer
    • Breadth First Search
    • Depth First Search
    • Linked List & Array
    • Two Pointers
    • Stack, Queue and Heap
    • Dynamic Programming
    • Two Pointers Advanced
    • Union Find and Trie
    • Dynamic Programming Advanced
  • 基础知识储备
    • Python
      • Stack and Queue
      • Namedtuple
      • Priority Queue
      • isinstance()
      • OrderedDict
      • set and frozen set
      • Counter
      • Heap
    • Bit Manipulation
    • Fenwick Tree or Binary Indexed Tree
    • Rabin-Karp Algorithm
    • Sort
      • Merge Sort
      • Quick Sort
      • Heap Sort
  • LintCode 练习题
    • Binary Search
  • OJ Review
    • Aug 7, 2018
    • Aug 8, 2018
    • Aug 9, 2018
    • Aug 13, 2018
    • Aug 17, 2018
    • Aug 19, 2018
    • Aug 24, 2018
    • Aug 26, 2018
    • Aug 27, 2018
    • Aug 29, 2018
    • Sep 1, 2018
    • Sep 2, 2018
    • Sep 3, 2018
    • Sep 4, 2018
    • Oct 28, 2018
    • Nov 13, 2018
Powered by GitBook
On this page
  • Merge Sort, Quick Sort and Heap Sort
  • Merge Sort
  • Quick Sort
  • Heap Sort
  1. 基础知识储备

Sort

直接写,别BB

Merge Sort, Quick Sort and Heap Sort

Merge Sort

Divide & Conquer

/**
 * Merge Sort.
 */
public void mergeSort(int[] nums) {
    int[] tmp = new int[nums.length];
    mergeSort(nums, tmp, 0, nums.length - 1);
}

private void mergeSort(int[] nums, int[] tmp, int start, int end) {
    if (start >= end) {
        return;
    }

    // divide
    int mid = start + (end - start) / 2;
    mergeSort(nums, tmp, start, mid);
    mergeSort(nums, tmp, mid + 1, end);

    // merge
    int index = start;
    int leftStart = start;
    int rightStart = mid + 1;

    while (leftStart <= mid && rightStart <= end) {
        if (nums[leftStart] <= nums[rightStart]) {
            tmp[index++] = nums[leftStart++];
        } else {
            tmp[index++] = nums[rightStart++];
        }
    }

    while (leftStart <= mid) {
        tmp[index++] = nums[leftStart++];
    }

    while (rightStart <= end) {
        tmp[index++] = nums[rightStart++];
    }

    for (int i = start; i <= end; i++) {
        nums[i] = tmp[i];
    }
}

Quick Sort

/**
 * Quick sort.
 */
public void quickSort(int[] nums) {
    quickSort(nums, 0, nums.length - 1);
}

private void quickSort(int[] nums, int start, int end) {
    if (start >= end) {
        return;
    }

    int left  = start;
    int right = end;
    int mid   = start + (end - start) / 2;
    int pivot = nums[mid];

    // overview sorted
    while (left <= right) {
        while (left <= right && nums[left] < pivot) {
            left++;
        }

        while (left <= right && nums[right] > pivot) {
            right--;
        }

        // swap left >= p with right <= p to make left <= p right >= p
        if (left <= right) {
            int tmp = nums[left];
            nums[left] = nums[right];
            nums[right] = tmp;
            left++;
            right--;
        }
    }

    quickSort(nums, start, right);
    quickSort(nums, left, end);
}

Heap Sort

/**
 * Heap sort.
 */
public void heapSort(int[] nums) {
    // build max heap: for each root node bottom to top and right to left
    for (int i = nums.length / 2; i >= 0; i--) {
        maxHeapify(nums, i, nums.length - 1);
    }

    // swap first and adjust the new root to right position
    for (int i = nums.length - 1; i > 0; i--) {
        int tmp = nums[0];
        nums[0] = nums[i];
        nums[i] = tmp;
        // after each iteration, largest goes to ith, next end at i - 1
        maxHeapify(nums, 0, i - 1);
    }
}

private void maxHeapify(int[] nums, int start, int end) {
    int parent = start;

    // top to bottom
    while (parent <= end) {
        int left = parent * 2 + 1;
        int right = parent * 2 + 2;
        int child = -1;

        if (left <= end && right <= end) {
            // large value as swap candidate
            child = (nums[left] >= nums[right] ? left : right);
        } else if (left <= end) {
            child = left;
        } else {
            return;
        }

        // max heap root >= left && root >= right
        if (nums[parent] >= nums[child]) {
            return;
        }

        // swap
        int tmp = nums[parent];
        nums[parent] = nums[child];
        nums[child] = tmp;

        // update parent index
        parent = child;
    }
}
}
PreviousRabin-Karp AlgorithmNextMerge Sort

Last updated 6 years ago