# coding=utf-8
# This is a sample Python script.
# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
class Solution(object):
def QuickSort(self, nums):
"""
:param i:
:param j:
:param nums:
:return:
快排:
数据结构与算法确实是计算机有且仅有的两大重点,
就比如快排,算法就是递归分治思想,但是实际实现的时候比如涉及将小于num[i]的元素全部前移,应该采用何种数据结构,
如果用链表,那么索引就是很难处理的事,如果用数组,那么数组怎么做到这个事
要么使用数组,并且每次重新调用深层递归的时候都新建一个数组,当然随着递归深度增加,数组越来越小,那不行,最后的返回值需要是一张完整的表怎么办?
*数组支持随机访问,链表支持修改元素
递归:交换元素,返回索引
1.怎么交换元素(写个函数?)
2.怎么返回排好的索引(因为选的参照是第一个元素,所以可以直接数有多少拿到了前边)
"""
def QS(i,j):
if j<i:#这个地方还得改,原因是如果i没有变化会变成QS(i,i-1)
pass
elif j-i<2:
if nums[i]>nums[j]:#递归结束
a=nums[i]
nums[i]=nums[j]
nums[j]=a
else:
pass#不交换
else:
k=i
for m in (range(i+1,j+1)):
if nums[m]<nums[k]:
nums.insert(i,nums.pop(m))
k+=1
else:
pass
QS(i,k-1)
QS(k+1,j)
QS(0,len(nums)-1)
a=Solution()
nums=[100,1,11,37,21,13,45,99,41,27]
a.QuickSort(nums)
print nums
自己写的代码是真的烂,然后照书上写了一遍,真的简洁
def QuickSort(nums):
"""
真神奇,但是这里还有个class方法自己不能调用自己的问题
:param nums:
:return:
"""
if len(nums)<2:
return nums
else:
pivot=nums[0]
less=[i for i in nums[1:] if i<pivot]
more=[i for i in nums[1:] if i>pivot]
return QuickSort(less)+[pivot]+QuickSort(more)
nums=[100,1,11,37,21,13,45,99,41,27]
print QuickSort(nums)
|