欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python-排序算法

程序员文章站 2022-05-26 22:26:03
...

1.插入排序(直接插入)

    def insert_sort(alist):  #插入排序 O(n^2)  稳定排序
        length = len(alist)
        for i in range(1,length):
            key = alist[i]
            j = i -1
            while j>0:
                if alist[j]>key:
                    alist[j+1] = alist[j]
                    alist[j] = key
                j -= 1
        return alist

2.希尔排序(插入排序的一种),分组进行插入排序
希尔排序的特点:
a.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
b.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
c.子序列的构成不是简单的“逐段分割”,而是将像个某个“增量“的记录组成一个组序列。
用下面的这张图来解释,这是数据结构书中的示例图
python-排序算法
第一趟的增量为5,第二趟的增量为3,第三趟的增量为1
增量的选择问题:
希尔排序的原理是每次对无序序列中的数隔d(增量)进行排序,这样,对着增量的减小,序列也会越来越有序,当增量减小到1时,序列也就成有序状态了。增量不一定是奇数,事实上,增量数组的选取是一个有很深入学问的事情,一个好的增量数组,可以使算法效率达到最快,这与数据的数量和混乱程度有关,然而,只要一个数组是递减的,并且最后一个值是1,都可以作为增量数组使用,并且也能完成排序工作,但是效率上可能就低一点了,也就是说算法的复杂度要升高。

def shell_sort(lists):
    # 希尔排序
    length = len(lists)
    step = 2
    group = length / step
    while group > 0:
        for i in range(0, group):
            j = i + group
            while j < length:
                k = j - group
                key = lists[j]
                while k >= 0:
                    if lists[k] > key:
                        lists[k + group] = lists[k]
                        lists[k] = key
                    k -= group
                j += group
        group /= step
    return lists

3.冒泡排序

    def bubble_sort(alist):   # 冒泡排序 O(n^2)  稳定排序
        length = len(alist)
        for i in range(length):
            for j in range(i+1,length):
                if alist[i]>alist[j]:
                    alist[i],alist[j] = alist[j],alist[i]
        return alist

4.快速排序

    def quick_sort(alist,left,right):    # 快速排序 O(nlogn)  不稳定排序
        if left >= right:
            return alist
        low = left
        high = right
        key = alist[low]
        while left<right:
            while left<right and alist[right]>key:
                right -= 1
            alist[left] = alist[right]
            while left<right and alist[left]<key:
                left += 1
            alist[right] = alist[left]
        alist[left] = key
        quick_sort(alist,low,left-1)
        quick_sort(alist,left+1,high)
        return alist
相关标签: Sort