464 · Sort Integers II - LintCode
# Description
Given an integer array, sort it in ascending order in place. Use quick sort, merge sort, heap sort or any O(nlogn) algorithm.
# Example
Example1:
Input: [3, 2, 1, 4, 5],
Output: [1, 2, 3, 4, 5].
Example2:
Input: [2, 3, 1],
Output: [1, 2, 3].
# Note
(用快速排速做這一題)
# 快排的基本三點:
- 選擇 pivot
- 劃分 2 個區域,長度不需相等(partition)
- 递歸處理子問題
# 如何把數組分為兩部份 (partition)
- 兩個指針,一個在頭,一個在尾
left
指針向右移,直到nums[left]
>=pivot
就停下- 意思是:因為
nums[left]
小於 pivot,已經在對的區域裡了,接下來不需要進行交換。
- 意思是:因為
right
指針向左移,直到nums[right]
<=pivot
就停下- 交換兩個指針的數
- 回到第二步,直到兩個指針相遇
# 兩個子問題的邊界
start, right
left, end
當循環結束時,right 一定小於 left
start = 4 的 index | |
end = nums.length - 1; //end = 9 的 index | |
e.g: | |
[ 4 [ right ] [pivot] [ left ] 9 ] |
# Code
time complexity : O(N log(N))
public class Solution { | |
private void sorting(int[] nums) { | |
if (nums == null) return; | |
quickSort(nums, 0, nums.length - 1); | |
} | |
private void quickSort(int[] nums, int start, int end) { | |
if (start >= end) return; | |
int left = start, right = end; | |
int pivot = nums[start + (end - start) / 2]; | |
while (left <= right) { | |
while (left <= right && nums[left] < pivot) { | |
left++; | |
} | |
while (left <= right && nums[right] > pivot) { | |
right--; | |
} | |
if (left <= right) { | |
int temp = nums[left]; | |
nums[left] = nums[right]; | |
nums[right] = temp; | |
left++; | |
right--; | |
} | |
} | |
quickSort(nums, start, right); | |
quickSort(nums, left, end); | |
} | |
} |
算法學習的網站:
第 5 节 双路快排 | 算法吧 (suanfa8.com)