http://www.lintcode.com/zh-cn/problem/sort-integers-ii/
题目
给一组整数,按照升序排序。使用归并排序,快速排序,堆排序或者任何其他 O(n log n) 的排序算法。
样例
给出 [3, 2, 1, 4, 5]
, 排序后的结果为 [1, 2, 3, 4, 5]
。
快速排序思路
每次拿第一个值开始从左到右进行比较,如果比第一个值小,中值得指针加1,与此同时如果中值指针不等于当前循环指针的话进行交换,保持比第一个值小的数是连续的,循环结束后将第一个值与中值指针的值交换,完成中值指针的值比左边的数都大,比右边的书都小,递归中值指针左右两边,直到左右指针相等完成排序。
实现代码
class Solution:
# @param {int[]} A an integer array
# @return nothing
def sortIntegers2(self, A):
# Write your code here
self.quickSort(A, 0,len(A))
def quickSort(self, array, start, end):
if start < end: #边界条件
# 不断获取中值指针,不断左右递归直到边界条件
parindex = self.partition(array, start, end)
self.quickSort(array, start, parindex)
self.quickSort(array, parindex + 1, end)
def partition(self, array, start, end):
index = start # 中值指针
num = array[start] # 初始比较值为第一个元素
for i in xrange(start+1, end):
if array[i] < num: # 如果小于则中值指针 +1
index += 1
if index != i:
# 如果中值指针不等于循环指针,则代表其中间有比第一个元素大的值,所以要把这个比较小的值换过去
# 使得比第一个元素小的值始终是连续的
array[index], array[i] = array[i], array[index]
# 当循环结束后,第二个元素到中值指针所在元素这一区间内所有的值都比第一个元素小
# 所以将第一个元素跟指针元素交换,完成排序
array[start], array[index] = array[index], array[start]
return index