几种经典排序方法在python中的实现

类别排序方法:

'''

插入排序的基本操作是将一个数据插入到有序数据中,从而得到一个编号加一的新的有序数据。该算法适合对少量数据进行排序,时间复杂度为O (n 2)。是一种稳定的排序方法。

插入算法将要排序的数组分成两部分:

第一部分包含这个数组的所有元素,除了最后一个元素(让数组多一个空间来插入)

第二部分只包含这个元素(即要插入的元素)。

第一部分排序后,将最后一个元素插入排序后的第一部分。

'''

def insert_sort(列表):

#插入排序

count = len(列表)

对于范围内的I(1,计数):

key =列表[i]

j = i - 1

而j & gt= 0:

if列表[j]& gt;关键:

列表[j + 1] =列表[j]

列表[j] =键

j -= 1

返回列表

'''

外壳排序是插入排序的一种。也称为缩减增量排序,它是直接插入排序算法的更高效和改进版本。希尔排序是一种不稳定的排序算法。这种方法是由dl提出后命名的。壳牌在1959。

Hill排序是将记录按照目标的一定增量进行分组,使用直接插入排序算法对每组进行排序;随着增量逐渐减小,每个组包含的关键词越来越多。当增量减少到1时,整个文件正好分成一组,算法终止。

'''

def shell_sort(列表):

#希尔排序

count = len(列表)

步骤= 2

组=计数/步

while group & gt0:

对于范围内的I(0,组):

j = i +组

而j & lt计数:

k = j -群

key =列表[j]

而k & gt= 0:

if列表[k]& gt;关键:

列表[k +组] =列表[k]

列表[k] =键

k -=组

j +=组

group /= step

返回列表

'''

冒泡排序已经反复访问了要排序的序列,一次比较两个元素,如果它们的顺序错了就交换。访问系列的工作一直重复,直到不需要交换为止,也就是说系列已经排序了。

'''

定义冒泡_排序(列表):

#冒泡排序

count = len(列表)

对于范围内的I(0,计数):

对于范围内的j(I+1,计数):

if列表[I]& gt;列表[j]:

temp = lists[j]

列表[j] =列表[i]

列表[i] =临时

返回列表

'''

快速排序

通过一次排序将待排序的数据分成两个独立的部分,其中一部分的所有数据都小于另一部分,然后按照这种方法对这两部分数据进行快速排序,整个排序过程可以递归进行,从而实现整个数据成为一个有序序列。

'''

def quick_sort(列表,左,右):

#快速排序

如果离开& gt=右:

返回列表

key =列表[左]

低=左

高=右

同时离开& lt右:

同时离开& lt权限和列表[权限]& gt;=键:

右-= 1

列表[左] =列表[右]

同时离开& lt右和列表[左]& lt;=键:

left += 1

列表[右] =列表[左]

列表[右] =键

quick_sort(列表,低位,左- 1)

quick_sort(列表,左+ 1,高)

返回列表

'''

直接选择排序

传递1,从要排序的记录中选择最小的记录,与r[1]交换;

第二遍,从待排序的记录r[2] ~ r[n]中选择最小的记录,与r[2]交换;

以此类推,在第I遍待排序的记录r[i] ~ r[n]中选择最小的记录,与r[i]交换,使有序序列不断增长,直到所有记录排序完毕。

'''

定义select_sort(列表):

#选择排序

count = len(列表)

对于范围内的I(0,计数):

最小值= i

对于范围内的j(I+1,计数):

if列表[min]& gt;列表[j]:

最小值= j

temp =列表[分钟]

列表[min] =列表[i]

列表[i] =临时

返回列表

'''

Heapsort是指利用堆树(heap)的数据结构设计的一种排序算法,是一种选择性排序。

您可以使用数组的特征来快速定位指定索引的元素。堆分为大根堆和小根堆,是一棵完整的二叉树。大根堆的要求是每个节点的值不大于其父节点的值,即a[parent[I]]>;= A[i].

在非降序排列的数组中,需要根堆,因为根据根堆的要求,最大值必须在堆的顶部。

'''

#调整堆

def adjust_heap(列表,I,大小):

lchild = 2 * i + 1

rchild = 2 * i + 2

最大值= i

如果我& lt尺寸/ 2:

如果lchild & lt大小和列表[lchild]>列表[最大]:

max = lchild

如果rchild & lt大小和列表[rchild]& gt;列表[最大]:

max = rchild

如果max!=我:

列表[最大值],列表[i] =列表[i],列表[最大值]

adjust_heap(列表,最大值,大小)

#创建堆

def build_heap(列表,大小):

对于范围内的I(0,(大小/2))[::-1]:

adjust_heap(列表,I,大小)

#堆排序

定义堆排序(列表):

size = len(列表)

build_heap(列表,大小)

对于范围(0,大小)[::-1]中的I:

列表[0],列表[i] =列表[i],列表[0]

adjust_heap(lists,0,I)

'''

归并排序是一种基于归并操作的有效排序算法,是分而治之的一个非常典型的应用。合并有序子序列以获得完全有序的序列;也就是说,首先对每个子序列进行排序,然后对子序列段进行排序。如果两个有序表合并成一个有序表,称为双向合并。

合并过程如下:

比较a[i]和a[j]的大小。若a[i]小于等于a [j],则将第一个有序表中的元素A [I]复制到r[k]中,I和K分别加1;

否则,将第二个有序表中的元素a[j]复制到r[k]中,并将J和K分别加1,以此类推,直到其中一个有序表用完,再将另一个有序表中剩余的元素复制到r中下标K到下标t的单元中,合并排序的算法通常是递归实现的。首先将待排序区间[s,t]用中点一分为二,然后对左子区间排序,再对右子区间排序,最后通过一次合并操作将左右区间合并为一个有序区间[s,t]。

'''

定义合并(左、右):

I,j = 0,0

结果= []

而我& ltlen(左)和j & lt伦(右):

如果离开[I]& lt;= right[j]:

result.append(left[i])

i += 1

否则:

result.append(右[j])

j += 1

result += left[i:]

result += right[j:]

回送结果

定义合并排序(列表):

#合并排序

if len(列表)& lt= 1:

返回列表

num = len(列表)/ 2

left = merge_sort(列表[:数量])

right = merge_sort(lists[num:])

返回合并(左,右)

'''

基数排序属于“分布排序”,也称为“桶排序”或bin排序。顾名思义,它通过键值的一些信息,将待排序的元素分布到一些“桶”中,从而实现排序功能。基数排序属于稳定排序。

它的时间复杂度为O (nlog(r)m),其中r是采用的基数,m是堆号。在某些情况下,基数排序法的效率高于其他稳定排序法。

'''

导入数学

def radix_sort(列表,radix=10):

k = int(math . ceil(math . log(max(lists),radix)))

bucket = [[] for i in range(radix)]

对于范围内的I(1,k+1):

对于列表中的j:

bucket[j/(radix * *(I-1))%(radix * * I)]。追加(j)

删除列表[:]

对于铲斗中的z:

列表+= z

del z[:]

返回列表

-

由CRazyDOgen

资料来源:CSDN

原文:/jipang 6225/文章/详情/79975312

版权声明:本文为博主原创文章,转载请附上博客链接!