Python基本排序算法示例(二)--插入排序、快速排序

被记住的永远是疯子!

插入排序

基本思想

如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。(via百度百科[1])

对于一个无序列表,例:{2,1,3,4,6},我们只能将第一个元素{2}看做有序列表,分别从原无序列表的第2个元素(index=1)向有序列表中插入,
第一次插入:比较1与2的大小,小于2则换位置,大于2则不变。此时为{1,2}
第二次插入:比较3与2的大小,大于2则不变,直接插入。此时为{1,2,3}
…以此类推

代码实现

class Sort:
    def __init__(self, list_):
        self.list_ = list_
    
    #插入排序
	def insert(self):
		# 将索引为0的元素看做有序列表,从索引为1的元素开始循环遍历
        for i in range(1, len(self.list_)):
            x = self.list_[i]
            j = i
            当满足j>0 并且 有序列表中的值大于插入值时
            while j > 0 and self.list_[j - 1] > x:
            	将原有序列表元素后移
                self.list_[j] = self.list_[j - 1]
                j -= 1
            上述条件满足时,将插入值从序列头部插入;上述条件不满足时,插入值从尾部插入
            self.list_[j] = x

快速排序

基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。(via百度百科[2])

代码实现

	# 一轮交换
    def sub_sort(self, low, high):
        key = self.list_[low]  # 基准数字
        while low < high:
            # 后面的数向前甩
            while low < high and self.list_[high] >= key:
                high -= 1
            self.list_[low] = self.list_[high]
            #  前面的数向后甩
            while low < high and self.list_[low] < key:
                low += 1
            self.list_[high] = self.list_[low]
        self.list_[low] = key
        return low

    #快速排序函数
    def quick(self, low, high):
        # low 列表开头元素索引
        # high 列表结尾元素索引
        if low < high:
            key = self.sub_sort(low, high)
            self.quick(low, key - 1)
            self.quick(key + 1, high)

测试代码

您可以复制以下代码进行测试

class Sort:
    def __init__(self, list_):
        self.list_ = list_
	
	# 插入排序
    def insert(self):
        for i in range(1, len(self.list_)):
            x = self.list_[i]
            j = i
            while j > 0 and self.list_[j - 1] > x:
                self.list_[j] = self.list_[j - 1]
                j -= 1
            self.list_[j] = x

    # 一轮交换
    def sub_sort(self, low, high):
        key = self.list_[low]  # 基准数字
        while low < high:
            # 后面的数向前甩
            while low < high and self.list_[high] >= key:
                high -= 1
            self.list_[low] = self.list_[high]
            #  前面的数向后甩
            while low < high and self.list_[low] < key:
                low += 1
            self.list_[high] = self.list_[low]
        self.list_[low] = key
        return low

    #  快排函数
    def quick(self, low, high):
        #  low 列表开头元素索引
        # high 列表结尾元素索引
        if low < high:
            key = self.sub_sort(low, high)
            self.quick(low, key - 1)
            self.quick(key + 1, high)


if __name__ == "__main__":
    l = [4, 1, 2, 6, 7, 3, 9, 8,6,2]
    sr = Sort(l)
    sr.insert()
    sr.quick(0, len(l) - 1)
    print(sr.list_)

参考:
[1]:https://baike.baidu.com/item/插入排序/7214992?fr=aladdin
[2]:https://baike.baidu.com/item/快速排序算法/369842?fromtitle=快速排序&fromid=2084344&fr=aladdin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值