博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python——排序
阅读量:5343 次
发布时间:2019-06-15

本文共 2730 字,大约阅读时间需要 9 分钟。

从学校毕业出来后只知道冒泡排序,发现自己对排序的了解还是很浅显。

于是在网上搜索各种排序方法,以下是本人根据索搜出来的资料再结合自己理解作出的一些简单的阐述。

如果有不正确的地方欢迎大家指正。(共同学习,共同进步)

1、插入排序:最优为O(n),最坏为O(n^2),平均O(n^2)

(1)始终定义第一个元素为有序的,将剩余元素逐个插入到这个有序列中。
(2)插入过程中,将需要插入的元素与有序列中的元素逐个比较,插入到适当位置
python:

def InserSort(lists):    count = len(lists)    for i in range(1,count):        key = lists[i]           #需要插入的元素        index = i            #记录插入的位置        while index>0 and lists[index-1]>key:             #逐个比较,若小于前一个数则将该元素向前移动位置            lists[index] = lists[index-1]                    index -= 1        #将需要插入的元素,插入指定位置        lists[index] = key        return lists
View Code

2、冒泡排序:最优为O(n),最坏为O(n^2),平均O(n^2)

(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。

(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
python:

def BubbleSort(lists):    count = len(lists)    for i in range(count):        for j in range(count-i-1):            if lists[j] > lists[j+1]:                lists[j],lists[j+1]=lists[j+1],lists[j]    #前后替换    return lists
View Code

3、希尔排序:(实质上是分组插入排序)

(1)取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中
(2)各组内进行直接插入排序
(3)取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 =1,即所有记录放在同一组中进行直接插入排序为止。

def ShellSort(lists):    count = len(lists)    group = count // 2    while group>0:        for i in xrange(count):            index =i             j = i+1            while j
View Code

4、快速排序:最有O(NlogN)

(1)设置两个变量i,j,排序开始的时候i=0,j=n-1。
(2)以数组第一个元素作为基数,key=A[0]。
(3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于或者等于key的值。
(4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于或者等于key的值。
(5)将第3步和第4步找到的数互换位置。
(6)重复3、4、5步骤, 直到i==j,将基数与A[i]互换。此时与A[i]为界分为两个区。
(7)将两个区重复3、4、5、6步骤

python

def  quickSort(lists,left,right):    if left >= right:        return lists    #设置基数    key = lists[left]    i = left    j = right    while i < j:        #从列表右边开始找比基数小或者相等的数        while i < j and lists[j] >= key:            j = j--        #从列表左边开始找比基数大或者等于的数        while i < j and lists[i] <= key:            i = i++        if i < j:            lists[i],lists[j]=lists[j],lists[i]    #做完第一轮比较,列表分成2个去,并且i=j,将这个数设置回基数    lists[left] = lists[i]    lists[i] = key    #递归前后半区  重复上述操作    quickSort(lists,left,i-1)    quickSort(lists,j+1,right)    return lists
View Code

5、箱排序:O(m+n)

(1)设置若干个箱子,依次扫描待排序的记录R[0],R[1],…,R[n-1]
(2)把关键字等于k的记录全都装入到第k个箱子里(分配)
(3)然后按序号依次将各非空的箱子首尾连接起来(收集)。
python

def  barrelSort(lists):    #选择一个最大的数    maxnum=max(lists)    #创建一个元素全是0的列表,作为箱    bucket = [0]*(maxnum+1)    #把所有元素放入箱中,对应元素个数加1    for  i  in  lists:        bucket[i] +=1    #存储排序好的元素    sort_lists=[]#取出箱中的元素    for  j  in  range(len(bucket)):        if bucket[j] != 0:            for n in range(bucket[j]):                sort_lists.append(j)    return sort_lists
View Code

转载于:https://www.cnblogs.com/witeem/p/7999713.html

你可能感兴趣的文章
GDB调试多进程程序
查看>>
组合数
查看>>
CMD批处理延时启动的几个方法
查看>>
转:LoadRunner中web_custom_request 和 web_submit_data的差别
查看>>
HTC G7直刷MIUI开启A2SD+亲测教程
查看>>
shiro的rememberMe不生效
查看>>
const 不兼容的类型限定符问题
查看>>
OpenCV的配置
查看>>
spring Cache + Redis 开发数据字典以及自定义标签
查看>>
成功连上数据库顿感世界美好许多
查看>>
编程注意2
查看>>
《C++ Primer Plus》第12章 类和动态内存分配 学习笔记
查看>>
javascript中sort()排序方法总结
查看>>
实现聊天界面的代码
查看>>
自己生成一个NDK的浅析
查看>>
Excel数据导入到数据库
查看>>
jQuery最佳实践
查看>>
SELinux FAQ
查看>>
Java中synchronized同步的理解
查看>>
python 数值计算库
查看>>