python中计算1_初识算法1(python实现)(读啊哈!算法)

冒泡排序

原理:以递减为例,每次查找队列中最小的值,并把他放到队列末尾

做法:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。

总结::如果有n 个数进行排序,只需将n-1 个数归位,也就是说要进行n-1 趟操作。而“每一趟”都需要从第1 位开始进行相邻两个数的比较,将较小的一个数放在后面,比较完毕后向后挪一位继续比较下面两个相邻数的大小,重复此步骤,直到最后一个尚未归位的数。

时间复杂度:

代码实现:

arr = [23,112,43,45,232,12]

for i in range(len(arr)-1):

for j in range(len(arr)-1-i):

if arr[j] > arr[j+1]:

tmp = arr[j]

arr[j] = arr[j+1]

arr[j+1] = tmp

print arr

快速排序

原理:① 以队列第一个数为基数basenum,设置两个变量i和j,分别指向队列的第一个和最后一个

② j先从右往左寻找小于basenum的值,找到后停止移动,i从左往右寻找大于basenum的值,找到后停止移动

③ 此时若j≠i,则交换队列中i位置和j位置的值,继续执行第二步;若j==i,则arr[0]=arr[i],arr[i] = basenum.此时队列可分为两部分arr[0:i-1]和arr[i+1,n],分别对两个队列执行①和②步。

注意:第二步中必须j先移动后,i才可以移动,根据下面代码可知即使basenum已经是最小了,i还是会至少移动一次,导致排序错误。

图释

1、定位一个数在队列中的位置

此时j≠i,继续~~~

2、整个排序流程

最差时间复杂度:

平均时间复杂度:

代码实现:

#quicksort_demo

def quicksort(left,right):

if not left < right:

return

else:

global arr

basenum = arr[left]

i = left

j = right

while j != i:

#注意下列两个比较必须要有等号,不然遇到队列有相同值时会造成死循环

while arr[j] >= basenum and j > i:

j = j - 1

while arr[i] <= basenum and i < j:

i = i + 1

if j > i:

tmp = arr[i]

arr[i] = arr[j]

arr[j] = tmp

arr[left] = arr[i]

arr[i] = basenum

quicksort(i+1,right) #递归基数右边

quicksort(left,i-1) #递归基数左边

if __name__ == "__main__":

arr_input = raw_input().split()

arr = []

for num in arr_input:

arr.append(int(num))

quicksort(0,len(arr)-1)

print arr

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值