Python实现常用排序算法总结

一、概述
排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。


当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。

快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;


二、算法实现

1. 交换排序之冒泡排序(Bubble Sort)

冒泡排序的时间复杂度是O(N^2)
冒泡排序的思想: 每次比较两个相邻的元素, 如果他们的顺序错误就把他们交换位置
冒泡排序原理: 每一趟只能将一个数归位, 如果有n个数进行排序,只需将n-1个数归位, 也就是说要进行n-1趟操作(已经归位的数不用再比较)
比如有五个数: 12, 35, 99, 18, 76, 从大到小排序, 对相邻的两位进行比较
第一趟:
第一次比较: 35, 12, 99, 18, 76
第二次比较: 35, 99, 12, 18, 76
第三次比较: 35, 99, 18, 12, 76
第四次比较: 35, 99, 18, 76, 12
经过第一趟比较后, 五个数中最小的数已经在最后面了, 接下来只比较前四个数, 依次类推
第二趟
99, 35, 76, 18, 12
第三趟
99, 76, 35, 18, 12
第四趟
99, 76, 35, 18, 12
比较完成

#!/usr/bin/env python
# coding:utf-8

def bubbleSort(lists):
    count=len(lists)
    for i in range(count-1):    # 这个循环负责设置冒泡排序进行的次数
        for j in range(count-i-1):  # j为列表下标
            if lists[j] > lists[j+1]:
                lists[j], lists[j+1] = lists[j+1], lists[j]
    return lists
lists = [43,19,28,38,56,73,99,49,66]
print (bubbleSort(lists))


2.交换排序之快速排序(Quick Sort)

基本思想:

1)选择一个基准元素,通常选择第一个元素或者最后一个元素,

2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。

3)此时基准元素在其排好序后的正确位置

4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。


lists=[55,46,37,99,16,81,73,61,19,49]
def quick_sort(lists, left, right):  
    # 快速排序  
    if left >= right:  
        return lists
    key = lists[left]  
    low = left  
    high = right  
    while left < right:  
        while left < right and lists[right] >= key:  
            right -= 1  
        lists[left] = lists[right]  
        while left < right and lists[left] <= key:  
            left += 1  
        lists[right] = lists[left]  
    lists[right] = key  
    quick_sort(lists, low, left - 1)  
    quick_sort(lists, left + 1, high)  
    return lists  
print quick_sort(lists, left=0, right=len(lists)-1)

3.归并排序(merge sort)
基本思想:
归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小元素放入结果序列中进行合并,最终完成归并排序。

lists = [43,19,28,38,56,73,99,49,66] 
def merge(left, right):  
    i, j = 0, 0  
    result = []  
    while i < len(left) and j < len(right):  
        if left[i] <= right[j]:  
            result.append(left[i])  
            i += 1  
        else:  
            result.append(right[j])  
            j += 1  
    result += left[i:]  
    result += right[j:]  
    return result  
   
def merge_sort(lists):  
    # 归并排序  
    if len(lists) <= 1:  
        return lists  
    num = len(lists) / 2  
    left = merge_sort(lists[:num])  
    right = merge_sort(lists[num:])  
    return merge(left, right) 
print merge_sort(lists)

4.插入排序之直接插入排序(Straight Insertion Sort)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值