范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python快速排序和归并排序

  快速排序(Quick sort)
  快速排序,是每次找一个数字(一般是列表的第一个元素)作为中间值,将小于这个中间值的元素都放在左边,比这个中间值大的放在右边。然后,对左边和右边的子序列进行递归操作,即可实现排序。只有一个元素的序列是有序的。
  将列表中第一个元素设定为基准数字,赋值给 mid 变量,然后将整个列表中比基准小的数值放在基准的左侧,比基准到的数字放在基准右侧。然后将基准数字左右两侧的序列在根据此方法进行排放。 定义两个指针,low 指向最左侧,high 指向最右侧。 然后对最右侧指针进行向左移动,移动法则是,如果指针指向的数值比基准小,则将指针指向的数字移动到基准数字原始的位置,否则继续移动指针。 如果最右侧指针指向的数值移动到基准位置时,开始移动最左侧指针,将其向右移动,如果该指针指向的数值大于基准则将该数值移动到最右侧指针指向的位置,然后停止移动。 如果左右侧指针重复则,将基准放入左右指针重复的位置,则基准左侧为比其小的数值,右侧为比其大的数值。
  首先,对于第一个元素进行操作。调整后的列表中,该元素左边的元素都比它小,右边的元素都比它大: alist = [3, 8, 5, 7, 6, 9, 2, 1, 4, 6, 3, 3, 2]    # 使用重复值更严谨 def quick_sort(alist):     left = 0    # 第一个元素下标     right = len(alist) - 1    # 最后一个元素下标     # 循环过后的序列中,要确保小于等于基准值的数字在基准值右侧,大于基准值的数在其左侧     while left < right:         # 先偏移right,此时基准值3位于left对应的位置         while left < right:             if alist[right] > alist[left]:                 right -= 1    # 如果right对应的值比基准值大,不需要操作,比较下一个数字             else:    # 如果right对应的值比基准值小(或等于),则将其与基准值交换位置                 alist[right], alist[left] = alist[left], alist[right]                 left += 1    # 因为原来基准值的位置left的元素已经检查过了,不需要重复检查,所以直接去下一个元素即可                 break         while left < right:             # 先偏移left,此时基准值3位于right对应的位置             if alist[right] >= alist[left]:                 left +=1    # 如果left对应的值比基准值小或者相等,不需要操作,比较下一个数字             else:    # 如果left对应的值比基准值大,将其于基准值交换位置                 alist[right], alist[left] = alist[left], alist[right]                 right -= 1    # 因为原来基准值的位置right的元素已经检查过了,不需要重复检查,所以直接去下一个元素即可                 break                      print(left, right)    # 5 5     return alist print(quick_sort(alist))    # [2, 3, 3, 1, 2, 3, 9, 6, 4, 6, 7, 5, 8]
  经一次操作后,左右两侧的索引都到了 5 的位置。接下来,我们对左右两部分的列表进行递归,即可实现快速排序: alist = [3, 8, 5, 7, 6, 9, 2, 1, 4, 6, 3, 3, 2] def quick_sort(alist, start, end):     left = start     right = end     while left < right:         while left < right:             if alist[left] < alist[right]:                 right -= 1             else:                 alist[left], alist[right] = alist[right], alist[left]                 left += 1                 break         while left < right:             if alist[left] <= alist[right]:                 left += 1             else:                 alist[left], alist[right] = alist[right], alist[left]                 right -= 1                 break     # 上述为核心操作,需要将核心操作递归左右到左右子序列中     if start < left - 1:    # 结束递归条件:当左侧只剩一个元素或没有元素时         quick_sort(alist, start, left - 1)    # 将sort作用到左侧序列中     if right + 1 < end:    # 结束递归条件:当右侧只剩一个元素或没有元素时         quick_sort(alist, right + 1, end)    # 将sort作用到右侧序列中     return alist quick_sort(alist, 0, len(alist) - 1)    # [1, 2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 8, 9]归并排序(Merge sort)
  归并排序采用分而治之的原理: 将一个序列从中间位置分成两个序列; 在将这两个子序列按照第一步继续二分下去; 直到所有子序列的长度都为 1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。
  如何合并?
  下图中的倒数第三行表示为第一次合并后的数据。其中一组数据为 4 8 , 5 7。该两组数据合并方式为:每一小组数据中指定一个指针,指针指向每小组数据的第一个元素,通过指针的偏移指定数据进行有序排列。排列情况如下: p1 指向 4,p2 指向 5,p1 和 p2 指向的元素 4 和 5 进行比较,较小的数据归并到一个新的列表中。经过比较 p1 指向的 4 会被添加到新的列表中,则 p1 向后偏移一位,指向了 8,p2 不变。 p1 和 p2 指向的元素 8,5 继续比较,则 p2 指向的 5 较小,添加到新列表中,p2 向后偏移一位,指向了 7。 p1 和 p2 指向的元素 8,7 继续比较,7 添加到新列表中,p2 偏移指向 NULL,比较结束。 最后剩下的指针指向的数据(包含该指针指向数据后面所有的数据)直接添加到新列表中即可。
  归并排序使用 Python 代码实现: alist = [3, 8, 5, 7, 6, 9, 2, 1, 4, 6, 3, 3, 2] def merge_sort(alist):     n = len(alist)     # 递归结束条件     if n <= 1:         return alist     # 将序列分成左右两部分,递归排序     mid = n // 2     left = merge_sort(alist[:mid])     right = merge_sort(alist[mid:])     # 将指针归零     left_pointer = right_pointer = 0     result = []    # 用于存放排序好的结果     # 比较指针位置的数字,较小的放到结果中,并依次移动指针     while left_pointer < len(left) and right_pointer < len(right):         if left[left_pointer] < right[right_pointer]:             result.append(left[left_pointer])             left_pointer += 1         else:             result.append(right[right_pointer])             right_pointer += 1     # 将左右两边剩余的元素直接放到结果中     result.extend(left[left_pointer:])     result.extend(right[right_pointer:])     # 将结果返回     return result print(merge_sort(alist))    # [1, 2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 8, 9]

iPhone14价格跳水,年轻人为啥不爱换手机?小米11用户有话说据媒体报道,iPhone14系列近期出现了严重跳水情况,不仅标准版与Plus版降价千元,甚至连此前溢价严重ProMax都有超过10价格波动。为什么会出现这种情况呢?一些专家研究后得2023年2月26日新闻简报,周末愉快正文共888字预计阅读时间3分钟码字不易,如果有用,请记得支持点赞关注转发!美好的一天,从读报开始,2月26日,癸卯年二月初七,星期日,周末愉快,幸福生活1银保监会要求加快处理提前只差一步!国产光刻机就能实现7nm工艺光刻机对芯片制造的意义非常大,如果没有光刻机,芯片将无法造出来。虽然芯片制造需要用上很多半导体设备,但光刻机的制造成本,研发难度和价值水准是最高的。荷兰的ASML公司掌握了EUV光目前这4款手机最吃香,全是大内存,最高直降910元,最低1939元如果您喜欢,可以点击上面的关注二字。后续会为您提供更多有价值的内容。今天分享,目前这4款手机最吃香,全是大内存,最高直降910元,最低1939元。最新消息据CCTV2经济信息联播报香港加密中心成立重推出比特币,有望回到牛市香港作为加密中心的建立是一项有可能引发新的比特币牛市的发展。正如报道的那样,香港的加密货币交易所可以获得虚拟资产服务提供商(VASP)许可证,以便在中国经济特区合法运营。近日,香港七一文学别有风味是春韭杜甫赠卫八处士中有夜雨剪春韭,新炊间黄粱的诗句,觉得大好。春韭搭配黄粱,莹莹碧色映衬着澄澄金黄,的确是一道美食,可谓人间有味是清欢。诗人是有福之人,战乱中偶遇少年知交卫八卫八没有什好吃一口吃掉春天,让味蕾尽情品尝新鲜力量甜蜜春光明媚,心情大好,胃口大开。冒出尖尖的鲜嫩新笋,脂香浓郁用料丰富的比萨,还有春天专属的甜品,一切蓄势待发,撩动心弦,尝遍春天。眉州东坡来自四川春天的第一拨儿食材,以等待春雷号角春据说,这是一道被客人点了,后厨得骂半个小时的菜,味道太赞了!春季万物复苏,适合吃鲜,不光是蔬菜和水果,海鲜也是。春季可是吃蛏子蛤蜊等贝类海鲜的最佳季节。蛤蜊虽然便宜,蛋它的肉质鲜美无比,被称为天下第一鲜百味之冠,而且营养也比较全面,低热能高这些白酒的谎言,为什么总有人不相信,酒友总有一天你会信对于喝酒这件事件,在我国社会上一直有很大的争议,因为从小家人就告诉我们,长大以后不要喝酒,喝酒伤身体。我们小时候也看到过很多醉酒的人,很害怕,但是长大以后却难免会跟酒有一些接触,特心肌缺血怎么预防?临床上患者出现心肌缺血的危害主要是由于未得到良好控制,疾病逐渐发展导致的。包括发展为心绞痛,缺血性心肌病级心力衰竭心律失常,甚至于猝死等情况,需要及时进行治疗。心肌缺血的预防我给大一名年轻人的心肌梗塞警示如何预防心血管疾病心肌梗塞是一种常见的心血管疾病,它的发生率在年轻人中也逐渐增加。最近,一位年轻人的心肌梗塞事件引起了广泛关注,这也提醒我们要警惕并预防心血管疾病的发生。这位年轻人名叫小李,今年只有
大航海时代4威力加强版盘点游戏中有哪些情侣大航海时代4威力加强版盘点游戏中有哪些情侣作者单机游戏小虾米大航海时代4,作为最经典的航海单机游戏,至今仍有无数的玩家还在大航海4的世界中游弋。在这款游戏中,七名主人公,在航海过程双眼皮手术再常见也别乱割!那么美的明星偏成了刀口明显的悲伤蛙如果说起医美界最为常见的手术,双眼皮手术一定榜上有名,而圈内确实有很多艺人,通过双眼皮手术实现了颜值的跃升。以周冬雨为例。对比刚出道时的样子,周冬雨的眼睛整个大了一圈,很有辨识度,雾雨飘零之森从阴雨连绵到春日和煦欢迎关注,获取更多游戏评测资讯,入手与否不再犹豫喜欢的不妨点个赞唷()对于喜爱此类RPG的玩家来说总有那么几款游戏是始终无法忘记的,比如狂父Ib还有今天要说的雾雨飘零之森。统一采用电影大咖后悔没接的经典角色霸王别姬在准备之初,原作者李碧华想找成龙出演段小楼,因为成龙从小在西班长大,会唱京剧,具有一流的国际影响力。但成龙依附嘉禾的老板何冠昌却为他制定了三条接戏规则,在电影中他不能哭,不魔兽世界伊利丹怒风一个复杂而多面的角色伊利丹怒风是魔兽世界游戏中的一个非常著名的角色,也是整个游戏世界中最具争议性的角色之一。他是一位被誉为半神的恶魔猎手,曾经是艾泽拉斯最强大的巫师之一,但在他的复仇心理和强烈的自我意所有女老师,你的不容易我们懂!你的这些权益,要好好被保护两会伴读要说哪个群体女性占比多,中小学教师肯定是当仁不让。在学校里,她们是老师,有时,又是妈妈。正因为有了她们,校园里也就多了许多美好!在每年的全国两会上,女性相关话题总能引起代表委员的热做好演员,不做绝望的文盲全国人大代表作家编剧赵冬苓全国两会期间,不少代表委员就文艺领域话题发表意见。全国政协委员中央戏剧学院院长郝戎认为,演员拼到最后,拼的是文化,他能走多远,靠的也是文化。全国政协委员导演员柯蓝23岁就年薪百万,50岁依然单身,有黄志忠陪伴不孤独一句话,惹上官司。一段戏,插足何音婚姻,被非议半生。而她面对这些,毫不畏惧地坦言我就是为名利而来,钱才是我的目的。让人好奇,沾着红三代光的柯蓝,为什么会那么喜欢钱?又为什么绯闻不断逆水寒我翻红2个月,却每天过得如履薄冰作为2023年首款现象级游戏,逆水寒老兵服已经吸引了太多人的目光。为了能够在魔兽国服关服后,继续为魔兽玩家们提供优质的游戏服务,网易特别选中了旗下画面表现最出色品质最过硬的3DMM骚气满满的看片神器!能和异性在线免费开房看电影看片,是现代人休闲时的一种消遣,在工作之余或节假日休息,小编都喜欢找一两部电影来打发时间。但是,每次看电影都感觉好孤单,一个人看太无聊了。看到精彩的片段没法分享给别人,看到槽点很大刘雯贺聪在巴黎,赢了秀场输了口碑,终于为她的贪婪买单娱评大赏近日,刘雯和贺聪在巴黎时装周,赢了秀场却输了口碑引发网友热议。刘雯贺聪巴黎的皇帝新装,何穗奚梦瑶维密的天使刘雯贺聪上衣失踪,漏了个寂寞。别再尬吹刘雯的高级感了,骨瘦如柴,笑