快速排序 非递归python_快速排序 递归与非递归 python实现

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值