排序

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

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

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

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

原文地址:https://www.cnblogs.com/cattree/p/10728951.html