python数据结构与算法(15)

选择排序
选择排序(Selection sort)是⼀种简单直观的排序算法。它的⼯作原理如 下。⾸先在未排序序列中找到最⼩(⼤)元素,存放到排序序列的起始位 置,然后,再从剩余未排序元素中继续寻找最⼩(⼤)元素,然后放到已排 序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置 上,则它不会被移动。选择排序每次交换⼀对元素,它们当中⾄少有⼀个将 被移到其最终位置上,因此对n个元素的表进⾏排序总共进⾏⾄多n-1次交 换。在所有的完全依靠交换去移动元素的排序⽅法中,选择排序属于⾮常好 的⼀种。
选择排序分析
排序过程:
python数据结构与算法(15)
python数据结构与算法(15)
红⾊表示当前最⼩值,⻩⾊表示已排序序列,蓝⾊表示当前
位置。

def        selection_sort(alist):                                n        =        len(alist)                                #        需要进⾏n-1次选择操作                                for        i        in        range(n-1):                                                                #        记录最⼩位置                                                                min_index        =        i                                                                #        从i+1位置到末尾选择出最⼩数据                                                                for        j        in        range(i+1,        n):                                                                                                if        alist[j]        <        alist[min_index]:                                                                                                                                min_index        =        j                                                                #        如果选择出的数据不在正确位置,进⾏交换                                                                if        min_index        !=        i:                                                                                                alist[i],        alist[min_index]        =        alist[min_index],        al ist[i]
alist        =        [54,226,93,17,77,31,44,55,20]
selection_sort(alist) print(alist)

时间复杂度
最优时间复杂度:O(n ) 最坏时间复杂度:O(n ) 稳定性:不稳定(考虑升序每次选择最⼤的情况)
选择排序演示
python数据结构与算法(15)
插⼊排序
插⼊排序(英语:Insertion Sort)是⼀种简单直观的排序算法。它的⼯作原 理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描, 找到相应位置并插⼊。插⼊排序在实现上,在从后向前扫描过程中,需要反 复把已排序元素逐步向后挪位,为最新元素提供插⼊空间。
插⼊排序分析
python数据结构与算法(15)

def        insert_sort(alist):                                #        从第⼆个位置,即下标为1的元素开始向前插⼊                                for        i        in        range(1,        len(alist)):                                                                #        从第i个元素开始向前⽐较,如果⼩于前⼀个元素,交换位置                                                                for        j        in        range(i,        0,        -1):                                                                                                if        alist[j]        <        alist[j-1]:
        alist[j],        alist[j-1]        =        alist[j-1],        alist[j]
alist        =        [54,26,93,17,77,31,44,55,20] insert_sort(alist) print(alist)

时间复杂度
最优时间复杂度:O(n) (升序排列,序列已经处于升序状态) 最坏时间复杂度:O(n ) 稳定性:稳定
插⼊排序演示
python数据结构与算法(15)
快速排序
快速排序(英语:Quicksort),⼜称划分交换排序(partition-exchange sort),通过⼀趟排序将要排序的数据分割成独⽴的两部分,其中⼀部分的 所有数据都⽐另外⼀部分的所有数据都要⼩,然后再按此⽅法对这两部分数 据分别进⾏快速排序,整个排序过程可以递归进⾏,以此达到整个数据变成 有序序列。
步骤为:

  1. 从数列中挑出⼀个元素,称为"基准"(pivot), 2. 重新排序数列,所有元素⽐基准值⼩的摆放在基准前⾯,所有元素⽐基 准值⼤的摆在基准的后⾯(相同的数可以到任⼀边)。在这个分区结束 之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3. 递归地(recursive)把⼩于基准值元素的⼦数列和⼤于基准值元素的⼦ 数列排序。
    递归的最底部情形,是数列的⼤⼩是零或⼀,也就是永远都已经被排序好 了。虽然⼀直递归下去,但是这个算法总会结束,因为在每次的迭代 (iteration)中,它⾄少会把⼀个元素摆到它最后的位置去。
    快速排序的分析python数据结构与算法(15)
    def        quick_sort(alist,        start,        end):                                """快速排序"""
                                #        递归的退出条件                                if        start        >=        end:                                                                return
                                #        设定起始元素为要寻找位置的基准元素
        mid        =        alist[start]
                                #        low为序列左边的由左向右移动的游标                                low        =        start
                                #        high为序列右边的由右向左移动的游标                                high        =        end
                                while        low        <        high:                                                                #        如果low与high未重合,high指向的元素不⽐基准元素⼩,则high向 左移动                                                                while        low        <        high        and        alist[high]        >=        mid:                                                                                                high        -=        1                                                                #        将high指向的元素放到low的位置上                                                                alist[low]        =        alist[high]
                                                                #        如果low与high未重合,low指向的元素⽐基准元素⼩,则low向右移动
                                                                while        low        <        high        and        alist[low]        <        mid:                                                                                                low        +=        1                                                                #        将low指向的元素放到high的位置上                                                                alist[high]        =        alist[low]
                                #        退出循环后,low与high重合,此时所指位置为基准元素的正确位置                                #        将基准元素放到该位置                                alist[low]        =        mid
                                #        对基准元素左边的⼦序列进⾏快速排序                                quick_sort(alist,        start,        low-1)
                                #        对基准元素右边的⼦序列进⾏快速排序                                quick_sort(alist,        low+1,        end)
    alist        =        [54,26,93,17,77,31,44,55,20] quick_sort(alist,0,len(alist)-1) print(alist)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值