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

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

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值