最全的最通俗易懂的算法——排序算法【1】

南笙酒味 提交于 2019-11-26 21:50:49

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实现

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!