zoukankan      html  css  js  c++  java
  • 排序

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

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

    #数组较大时,选快排或者其他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

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

  • 相关阅读:
    Get distinct count of rows in the DataSet
    单引号双引号的html转义符
    PETS Public English Test System
    Code 39 basics (39条形码原理)
    Index was outside the bounds of the array ,LocalReport.Render
    Thread was being aborted Errors
    Reportviewer Error: ASP.NET session has expired
    ReportDataSource 值不在预期的范围内
    .NET/FCL 2.0在Serialization方面的增强
    Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
  • 原文地址:https://www.cnblogs.com/cattree/p/10728951.html
Copyright © 2011-2022 走看看