冒泡排序
原理:以递减为例,每次查找队列中最小的值,并把他放到队列末尾
做法:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。
总结::如果有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