Quick sort 是一种常用的算法。
quick sort 的常用算法实现。其中有三个重要的点
求出pivot点,求去该点的时候可以使用
int pivot = nums[(start + end) / 2];
不使用int pivot = nums[0] 或 int pivot = nums[end] 是为了避免出现时间复杂度为O(n ^ 2)的情况出现。当array是已经排序好的数组的时候,直接使用pivot = nums[start]会出现极端的情况。写while循环的时候,一定要使用
left <= right
if 循环的时候,也是同样。当只是使用left < right 的情况下因为left 和 right 可能在循环的时候并没有相互的交错开会出现内存溢出的情况。使用left 和 pivot点进行表的使用left < pivot,而不是使用
left <= right, 同样这也是为了避免极端情况的发生。
使用LintCode的Integer Sort为例进行代码的处理。
description:
Given an integer array, sort it in ascending order. Use selection sort, bubble sort, insertion sort or any O(n2) algorithm.
Example
Given [3, 2, 1, 4, 5], return [1, 2, 3, 4, 5].
public class Solution {
/**
* @param A an integer array
* @return void
*/
public void sortIntegers(int[] A) {
// Write your code here
int start = 0;
int end = A.length - 1;
util(A, start, end);
}
private void util(int[] A, int start, int end) {
if (start >= end) {
return;
}
int pivot = A[(start + end) / 2];
int left = start;
int right = end;
while (left <= right) {
while (left <= right && A[left] < pivot) {
left++;
}
while (left <= right && A[right] > pivot) {
right--;
}
if (left <= right) {
int temp = A[right];
A[right] = A[left];
A[left] = temp;
right--;
left++;
}
}
util(A, start, right);
util(A, left, end);
}
}