• 排序


    #工程上的排序是综合排序

    #数组较小时使用插入排序

    #数组较大时,选快排或者其他nlogn的排序

    1.冒泡排序:o(n^2)  稳定排序

    一开始交换的区间为0---N-1 ,即整个数组的整体。第一个数与第二个数比较,哪个大那个就放到后面,然后是第2个数与第3个数比较,哪个大哪个放在后面,这样依次交换过去,最大的数会最终放在数组的最后一个位置,然后把范围从0----N-1变为0---N-2,这样一来,第二大的数会被放到整个数组倒数第二个位置,依次这样交换,把范围从N变成0时,整个数组就变得有序了。

    2.选择排序:o(n^2)  不稳定排序

    一开始在0---N-1上选出一个最小值,把它放在0上(与0号位置的元素交换),然后在1---N-1上选出最小值放在1上(与1上元素交换)直到从0---N-1到 N-1------N-1 时整个数组就变得有序了。

    3.插入排序:o(n^2)  稳定排序

    位置1上的数与位置0上的数比较,如果位置1上的数更小,那么它就与位置0上的数交换。然后考察位置2上的数,如果2 上的数记为a的话,让a与其前面的数进行比较,如果a比位置1上的数小,那么a与1上的数交换,交换之后,a再与0上的数比较,假如a小于0位置上的数,那就与0位置上的数交换。结束。对于位置k上的数b,b依次与前边的数比较,如果b一直小于前面的数,就一直比较,直到b前面的数小于等于b,那么b就插入到当前位置。当我们从1到N-1都进行这样的比较之后,最终整个数组就有序了。

    4.并归排序:o(n*logn)   稳定排序

    让数组中的每一个数单独成为长度为1的有序区间,然后将相邻的长度为1的有序区间合并,得到最大长度为2的有序区间,再把相邻的有序区间合并得到最大长度为4的有序区间,,,,依次进行下去,直到菜单中所有数合并成统一有序区间,整个过程结束。

    5.快速排序:o(n*logn)  不稳定排序

    随机在数组中选1个数,小于等于这个数的数,统一放在左边,大于等于这个数的数统一放在右边,接下来在这个数的左右两个部分分别递归调用快排过程,这样整个数组就有序了。

    快排划分过程:Partition过程:

    @将划分值放在数组最后一个位置(与最后一个位置元素互换)

    @设置1个小于等于区间,初始长度为0,放在整个数组左侧

    @从左向右遍历整个数组,若当前元素大于划分值,就继续遍历下一个元素,如果当前元素小于等于划分值,就将当前数与小于等于区间的下一个数交换,并令小于等于区间向右阔一个位置

    @在遍历完所有的元素直到最后一个元素时(倒数第二)将划分值与小于等于区间的下一个数交换,这就是一此完整的划分过程。o(N)

    def partition(nums, begin: int, end: int) -> int:
        pivot = nums[end]
        index = begin
        for i in range(begin, end):
            if nums[i] > pivot:
                nums[i], nums[index] = nums[index], nums[i]
                index = index + 1
        nums[index], nums[end] =  nums[end], nums[index]
        return index
    
    def nsort(nums, begin: int, end: int):
            if begin < end :
                index = partition(nums, begin, end)
                nsort(nums, begin, index - 1)
                nsort(nums, index + 1, end)
        
    
    
    a = [3,2,5,1,8,2,4,6]
    nsort(a,0,7)
    print(a)
    

      

    6.堆排序:o(n*logn)  不稳定排序

    将数组中的所有元素建成一个大小为n的大根堆,堆顶是所有元素最大的元素,将堆顶元素与堆的最后一个元素交换,然后将最大值脱离堆结构,放在数组最后位置,作为数组有序部分,再将n-1个元素的堆调整为大顶堆,再调整出一个最大值,放到数组倒数第二的位置,如此继续调整大根堆,这样堆的大小依次减为1,数组依次加一,当堆的大小减为1时,整个数组就有序了。

    7.希尔排序:o(n*logn)   不稳定排序

    是插入排序的改良版排序。插入排序步长为1。希尔排序的步长是逐渐调整的(从大到小调整)eg:6  5  3  1  8  7  2  4  ,假设步长为3,1往前跳3个,与6比较,1< 6,1与6交换,停止。然后8向前跳3个,8>5,直接停止交换,进行下一个比较。7>3     2< 6 ,2向前跳3个到1,2比1大,停止,4向前3位,4<8 ,4 8 交换,4再向前跳三个,4<5 ,交换,再向前3位,4>1 结束。步长减为2,重复此步骤,步长减为1,重复此步骤。最终数组变得有序。步长的选择越好越趋近于n*logn。

    8.基于桶排序的算法:计数排序: o(M)   M位桶的个数。  稳定排序

    比如要为全公司的人身高排序。

    成年人的身高100,101,102,103......200

    根据cm数依次建立xxcm号桶,把所有员工按照各自对应的身高放入桶内,再依次从大桶到小桶倒出来,员工被倒出的顺序就是按身高排序的顺序。

    9.基于桶排序的算法:基数排序:o(M)   稳定排序

    @每个数根据其个位上的数入桶,再依次倒出来@1

    @把倒出来的数列每个数按照其十位上的数倒入桶内,再依次倒出@2

    @每个数根据其百位上的数倒入,再依次倒出,此时数组有序。

  • 相关阅读:
    python 练习 10
    python 练习 9
    运算符
    变量类型
    打印更多的变量
    变量和命名
    数字和数字计算
    第一个程序
    python 练习 8
    python 练习 7
  • 原文地址:https://www.cnblogs.com/cattree/p/10728951.html
Copyright © 2020-2023  润新知