八大排序算法_python

1.冒泡排序

    冒泡排序即重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端;

步骤:

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一步后,最后的元素应该是最大的数。

3.针对所有的元素重复以上的步骤,除了上一步最后一个数不做比较。

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码实现:

# _*_coding:utf-8_*_
def bubble_sort(lst):
    length = len(lst)
    for index in range(length):
        for i in range(1, length-index):
            if lst[i-1] > lst[i]:
                lst[i], lst[i-1] = lst[i-1], lst[i]
    return lst

if __name__ == "__main__":
    test_lst = [10, 23, 1, 53, 654, 54, 16, 646, 65, 3155, 546, 31]
    print bubble_sort(test_lst)

 注意:列表交换元素不需要设置temp变量 
 
lst = [1, 2, 3, 4, 5]
lst[0], lst[1] = lst[1], lst[0]
print lst
2.选择排序
    从待排序的数据元素中选出最小(或最大)的一个元素,存放在每趟序列的起始位置,直到全部待排序的数据元素排完
代码实现:
# _*_coding:utf-8_*_
def select_sort(lst):
    length = len(lst)
    for index in range(length):
        for i in range(index, length):
            if lst[index] > lst[i]:
                lst[index], lst[i] = lst[i], lst[index]
    return lst

if __name__ == "__main__":
    test_lst = [10, 23, 1, 53, 654, 54, 16, 646, 65, 3155, 546, 31]
    print select_sort(test_lst)
3.插入排序
    每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的值中适当位置上,直到全部插入完为止。
     1.从第一个元素开始,该元素可以认为已经被排序
     2.取出下一个元素,在已经排序的元素序列中从后向前扫描
     3.如果该元素(已排序)大于新元素,将该元素移到下一位置
     4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
     5.将新元素插入到该位置后
     6.重复步骤2~5
    代码实现:
# _*_coding:utf-8_*_
def insert_sort(lst):
    count = len(lst)
    for i in range(1, count):
        key = lst[i]
        j = i-1
        while j >= 0:
            if lst[j] > key:
                lst[j+1] = lst[j]
                lst[j] = key
            j -= 1
    return lst

if __name__ == "__main__":
    test_lst = [10, 23, 1, 53, 654, 54, 16, 646, 65, 3155, 546, 31]
    print insert_sort(test_lst)
4.希尔排序
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量  dt=1(dt<dt-1....d2,d1)  即所有记录放在同一组中进行直接插入排序为止
代码实现:
# _*_ coding:utf-8 _*_
def shell_sort(lst):
    length = len(lst)
    dist = length/2
    while dist > 0:
        for i in range(dist, length):
            temp = lst[i]
            j = i
            while j > dist and temp < lst[j-dist]:
                lst[j] = lst[j-dist]
                j -= dist
            lst[j] = temp
        dist /= 2
    return lst

if __name__ == "__main__":
    test_lst = [10, 23, 1, 53, 654, 54, 16, 646, 65, 3155, 546, 31]
    print shell_sort(test_lst)




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值