排序--python实现

一、冒泡排序、选择排序、插入排序

之所以要把他们列在一起是因为这三个排序的时间复杂度均为 O(n2) O ( n 2 )
下面简单介绍这三个排序的基本原理。注:画图更便于理解

  • 冒泡排序:简单来讲就是每次将最大的数字排在后面,假设有下列列表:
    [6,3,5,7,0,4,1,2]—->[3,6,5,7,0,4,1,2]—->[3,5,6,7,0,4,1,2]—>[3,5,6,7,0,4,1,2]–>[3,5,6,0,7,4,1,2]—->[3,5,6,0,4,7,1,2]—>[3,5,6,0,4,1,7,2]—->[3,5,6,0,4,1,2,7]
    也就是说第一次经过N-1次比较,最大的数放在后面,第二轮经过N-2次比较,次大的数放在后面。。。。

    第一个数与第二个数比较,哪个大哪个在后面,交换位置,(指的是交换位置后)然后第二个数与第三个数比较,交换位置,哪个大哪个放在后面,(同指交换位置后)第三个数与第四个数比较哪个大哪个放在后面,依此类推。每一轮比较都能把最大的数放在后面。

  • 选择排序:简单讲每次都是把最小的数放在最前面,然后比较除这个数外其他所有的数,再把最小的放到第二位,依此类推,假设有下列列表:
    [6,3,5,7,0,4,1,2]—>[0,6,3,5,7,4,1,2]—>[0,1,6,3,5,7,4,2]—>[0,1,2,6,3,5,7,4]—>[0,1,2,3,6,5,7,4]—->[0,1,2,3,4,6,5,7]—>[0,1,2,3,4,5,6,7]

  • 插入排序:插入排序就是假定前面的数都是有序的,然后将一个数插入到前面有序的这个序列中,当从第一个开始时,就保证了这个数组要排序的数的前面的序列都是有序的,假设有如下列表:
    [6,3,5,7,0,4,1,2]—>[3,6,5,7,0,4,1,2]—>[3,5,6,7,0,4,1,2]–>[3,5,6,7,0,4,1,2]—>[0,3,5,6,7,4,1,2]—>[0,3,4,5,6,7,1,2]—>[0,1,3,4,5,6,7,2]—>[0,1,2,3,4,5,6,7]

二、归并排序、快速排序、堆排序、希尔排序

这三个列为一起,是因为它们的时间复杂度为 ONlogn O ( N l o g n )

  • 归并排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
    这里写图片描述

“`
- 快速排序:

1、先从数列中取出一个数作为基准数

2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边

3、再对左右区间重复第二步,直到各区间只有一个数 “`

如下列列表:
6,3,5,7,0,4,1,2
先随机选中一个数5,把5放在最后面,{ }用来存比5小的元素:
{ } 6 3 7 0 4 1 2 5 第一轮比较,6大于5不换
第二轮比较,3小于5,于是3与目前首位元素6换位置,{}往后移动一位:
{3} 6 7 0 4 1 2 5
第三轮比较,7大于5,不换
第四轮比较,0小于5,于是0与目前首位元素6换位置,{}往后移动一位:
{3 0}6 7 4 1 2 5
第五轮比较,4小于5,于是4与6换位置,{}往后移动一位:
{3 0 4}6 7 1 2 5
第六,第七轮比较,1与2 均小于5,分别与6换位置,有:
{3 0 4 1 2}6 7 5
此时,比较完所有元素,原来选定的数5放到{}之后:
{3 0 4 1 2}5{6 7}
再分别对{3 0 4 1 2}与{6 7}选定随即一个数进行快速排序即可。

  • 希尔排序
    希尔排序步长的选择是希尔排序的重要部分。只要最终步长为1任何步长序列都可以工作(且步长要小于数组长度)。算法最开始以一定的步长进行排序。然后会继续以一定步长进行排序,最终算法以步长为1进行排序。当步长为1时,算法变为插入排序,这就保证了数据一定会被排序
    简单例子分析:

待排序数组:
{6, 5, 3, 1, 8, 7, 2, 4, 9, 0}

第一次步长h=4,
那么数组按照步长可以拆分成4个小数组([0]6的意思是下标[0]的值为6)

{[0]6, [4]8, [8]9}
{[1]5, [5]7, [9]0}
{[2]3, [6]2}
{[3]1, [7]4}

对这4个小数组分别进行插入排序后,4个小数组变成:
{[0]6, [4]8, [8]9}
{[1]0, [5]5, [9]7}
{[2]2, [6]3}
{[3]1, [7]4}
合并起来就是:{6, 0, 2, 1, 8, 5, 3, 4, 9, 7}

第二次步长h=1,
那么数组按照步长只有1个数组了
{6, 0, 2, 1, 8, 5, 3, 4, 9, 7}

对这个数组进行一次插入排序后,最终顺序就成为:
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值