Description
实现递归与非递归快排
Input
输入的每一行代表一个数组,其中的值用空格隔开,第一个值表示数组的长度。
Output
输出排序的数组,用空格隔开,末尾不要空格。
Sample Input 1
13 24 3 56 34 3 78 12 29 49 84 51 9 100
Sample Output 1
3 3 9 12 24 29 34 49 51 56 78 84 100
'''
'''
快排基本思想就是利用了分治的思想,分而治之。
通过一趟排序将序列分为两部分,其中一部分比较关键字小,一部分比关键字大。
之后继续对这两个子序列重复此过程,直到整个序列都有序。
'''
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
File Name: Problem7
Description :
Author : xszhou
date: 2019/1/8
-------------------------------------------------
"""
__author__ = 'xszhou'
import sys
import collections
def partition(arr, left, right):
begin = left
end = right - 1
key = arr[end]
while begin < end:
# 把大于key的移到右边
while begin < end and arr[begin] <= key:
begin += 1
if begin < end:
arr[end] = arr[begin]
end -= 1
# 把小于key的移到左边
while begin < end and arr[end] >= key:
end -= 1
if begin < end:
arr[begin] = arr[end]
begin += 1
arr[end] = key
return end
# 递归版
def QuickSort(arr, left, right):
if left < right:
boundary = partition(arr, left, right)
QuickSort(arr,left,boundary)
QuickSort(arr,boundary+1,right)
# 非递归版,其实就是用到栈将序列的起始位置与结束位置记录下来
def QucikSortNoR(arr,left,right):
if left >= right:
return
s = collections.deque()
s.append(left)
s.append(right)
while len(s) > 0:
right = s[-1]
s.pop()
left = s[-1]
s.pop()
if left < right:
boundary = partition(arr,left,right)
# 左边
s.append(left)
s.append(boundary)
# 右边
s.append(boundary+1)
s.append(right)
if __name__=='__main__':
while True:
line = sys.stdin.readline()
if not line:
break
arr = [int(x) for x in line.strip().split(' ')]
arr.remove(arr[0])
# *******************************************************
# 递归快排
# QuickSort(arr,0,len(arr))
# *******************************************************
# *******************************************************
# 非递归快排
QucikSortNoR(arr,0,len(arr))
# *******************************************************
i_index = -1
for i in arr:
i_index += 1
if i_index < len(arr) - 1:
print(str(i), end=' ')
else:
print(str(i))
Post Views:
1,339