1、冒泡排序
冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。
# python [升序的排序]
s = [3,4,5,6,7,12,11]
n = len(s)
i=0
j=0
for i in range(len(s)-1):
for j in range(len(s)-1-j):
'''
len(s)-1-j解释:这里减去j的意思是,最大的数已经在最下面没必要比较了。
'''
if s[j]>s[J+1]:
temp = s[j+1]
s[j+1] = s[j]
s[j] = temp
print (s)
########升序and 降序代码,改变判断符号即可
s = input().split()
n = len(s)
i =0
j =0
for i in range(n-1):
for j in range(n-1):
if s[n-j-2]<s[n-j-1]:
temp = s[n-j-2]
s[n-j-2]=s[n-j-1]
s[n-j-1]=temp
print(s)
当原始序列“正序”排列时,冒泡排序总的比较次数为n-1,移动次数为0,也就是说冒泡排序在最好情况下的时间复杂度为O(n);
当原始序列“逆序”排序时,冒泡排序总的比较次数为n(n-1)/2,移动次数为3n(n-1)/2次,所以冒泡排序在最坏情况下的时间复杂度为O(n^2);
当原始序列杂乱无序时,冒泡排序的平均时间复杂度为O(n^2)。
2、快速排序【C.R.A.Hoare 于1960年提出】
解题思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
原理:通过扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。【官方说法,贼拗口】
白话原理:对于无序数列,我们取出其中一位数a,比a大的放右边,比a小的放左边。依次下去,在取值b,就是我们上面个的动图。下面的树形状也很好理解。
上述的动图and树状图可以很好的展示快速排序的方法原理。【够不够明显,够不够白话】
##最简单的快速排序解法
def quicksort (a):
if len(a) == 0 :
return []
else:
pivot = a[0]
left = []
right = []
mid = []
for x in a:
if x < pivot:
left.append(x)
elif x > pivot:
right.append(x)
else:
mid.append(pivot)
'''
这里注意,如果没有mid,递归会报错,python默认递归次数989,会陷入死循环。
'''
return quicksort(left) + mid +quicksort(right)
nums = [6,1,2,7,9,3,4,5,10,8]
print (quicksort(nums))
这个是按照最简单的思维去写,程序的模型看看上面的白话解释、白话解释、白话解释【重要的事说3遍】
当然python有多种解法。推荐博客快速排序的四种python实现