各种排序算法

1. 插入排序

def insertsort(a):
    if len(a)==1:
        return a
    for i in range(1,len(a)):
        j=i-1
        insert=a[i]
        while j>=0 and a[j]>insert:
            a[j+1]=a[j]
            j=j-1
        a[j+1]=insert
    return a

插入排序首先认为第一个元素是排好序的,然后将之后的元素往排好序的元素里插入,这里用了一个while循环来替代了swap的交换,可以提高效率。

时间复杂的:

最好情况下数组已经排好序,每次while循环里只比较一次,所以是\Theta (n)

最坏情况下数组倒序,每次while循环里要比较i次,i从1到n,比较1+2+...+n=n(n+1)/2,所以是\Theta (n^2)

2. 堆排序

堆排序首先构造一个堆,堆分为大顶堆和小顶堆。以大顶堆为例,大顶堆是一个完全二叉树,每一个节点都要大于它的左右孩子节点,所以根节点是最大的。排序的方法就是先构造一个大顶堆,然后将根与最后一个节点交换,剩余的节点再调成为大顶堆,选出最大的根节点再交换,依次选出树中最大的节点来。时间复杂度是nlogn,虽然看上去是简单的每次选最大的,但是用树形结构相当于记录了每次比较的结果,在算法中可以看到每次循环只比较了树高次的节点。

def adject_heap(ls,i,size):
    lchild=2*i+1
    rchild=2*i+2
    max=i

    if i<size/2:
        if lchild<size and ls[lchild]>ls[max]:
            max=lchild
        if rchild<size and ls[rchild]>ls[max]:
            max=rchild
        if max!=i:
            ls[max],ls[i]=ls[i],ls[max]
            adject_heap(ls,max,size)

def build_heap(ls,size):
    for i in range(0,int(size/2))[::-1]:
        adject_heap(ls,i,size)

ls=[49,38,65,97,76,13,27,49]
size=len(ls)
build_heap(ls,size)
for i in range(0,size)[::-1]:
    ls[0],ls[i]=ls[i],ls[0]
    adject_heap(ls,0,i)
print(ls)

首先构造大顶堆,build_heap。在数组上没有显式的构造树,而是假设数组是从前到后排成一个树,49是根,38,65是它的子节点,依次往后。所以构造大顶堆的过程就是调整数组让它成为一个大顶堆,也就是adject_heap。注意build_heap里我们是从size/2开始到0的,这样做是因为叶节点没有子节点所以不用调整,而且调整要从下到上。

通过分析数组下标可以发现,49是根,标号是0,它的左右孩子分别是1和2,也就是lchild=2*i+1,rchild=2*i+2。有的博客会在最前面加一个0辅助,这样是没有必要的。调整的方法就是先记录三个下标,max=当前节点,lchild,rchild是左右孩子,比较max的节点和孩子比哪个大,大的话将max赋值给哪个节点的下标。注意要判别child的下标<size and i<size/2。比较完了交换节点,交换之后的话原先的i节点的数字被交换到下面去了,可能会影响下面的树不满足堆,所以要接着调整下面,此时当前节点是max.

经过build_heap之后现在是一个大顶堆了,根是数组中最大的元素,将根与数组最后一个元素交换,此时再对除最后一个元素之外的元素调整成堆,获得根就是最大值再添加到末尾,依次从大到小排序。

3. 快速排序

def quick(ls,start,end):
    if not ls:
        return
    i,j=start,end
    key=ls[start]
    if start<end:
        while i<j:
            while i<j and ls[j]>=key:
                j=j-1
            ls[i]=ls[j]

            while i<j and ls[i]<=key:
                i=i+1
            ls[j]=ls[i]

        ls[i]=key

        quick(ls,start,i-1)
        quick(ls,j+1,end)

    return ls

#ls=[49,38,65,97,76,13,27,49]
ls=[1,3]
quick(ls,0,len(ls)-1)
print(ls)

快速排序就是选取数组中的一个数为key,然后将比key大的数都移到右边,比key小的数都移到左边,然后再递归用这种方法排序左边和右边。这种方法还可以用来求数组中第k大的数。

快速排序有各种方法,不同在排序的方法上,我这里使用的是挖坑法。先记录下key的值,然后右指针往左扫到小于key的数的时候将数赋给之前挖的坑,这里就变成了新坑,然后左指针向右扫描到大于key的数填到坑里又出现新坑,最后剩下的坑填入我们之前保存的key值。

内容概要:文章基于4A架构(业务架构、应用架构、数据架构、技术架构),对SAP的成本中心和利润中心进行了详细对比分析。业务架构上,成本中心是成本控制的责任单元,负责成本归集与控制,而利润中心是利润创造的独立实体,负责收入、成本和利润的核算。应用架构方面,两者都依托于SAP的CO模块,但功能有所区分,如成本中心侧重于成本要素归集和预算管理,利润中心则关注内部交易核算和获利能力分析。数据架构中,成本中心与利润中心存在多对一的关系,交易数据通过成本归集、分摊和利润计算流程联动。技术架构依赖SAP S/4HANA的内存计算和ABAP技术,支持实时核算与跨系统集成。总结来看,成本中心和利润中心在4A架构下相互关联,共同为企业提供精细化管理和决策支持。 适合人群:从事企业财务管理、成本控制或利润核算的专业人员,以及对SAP系统有一定了解的企业信息化管理人员。 使用场景及目标:①帮助企业理解成本中心和利润中心在4A架构下的运作机制;②指导企业在实施SAP系统时合理配置成本中心和利润中心,优化业务流程;③提升企业对成本和利润的精细化管理水平,支持业务决策。 其他说明:文章不仅阐述了理论概念,还提供了具体的应用场景和技术实现方式,有助于读者全面理解并应用于实际工作中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值