乐趣区

关于python:排序方式

​上次实现了几个排序形式,这次咱们持续往下再来写一下其余的排序形式

插入排序

定义:

插入排序是一种简略直观的排序算法,它的工作原理是通过构建有序序列,对未排序数据,在已排中从前向后扫描,找到相应地位并插入。(On^2)代码实现:

def insert_sort(alist):
    # 从第二个地位,即下标为 1 的元素开始向前插入
    for i in range(1, len(alist)):
        # 从第 i 个元素开始向前比拟,如果小于前一个元素,替换地位
        for j in range(i, 0, -1):
            if alist[j] < alist[j-1]:
                alist[j], alist[j-1] = alist[j-1], alist[j]
alist = [54,26,93,17,77,31,44,55,20]
insert_sort(alist)
print(alist)

桶排序

定义:

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的要害就在于这个映射函数的确定。桶排序 (Bucket sort) 的工作的原理:假如输出数据遵从均匀分布,将数据分到无限数量的桶里,每个桶再别离排序(有可能再应用别的排序算法或是以递归形式持续应用桶排序进行排)。(On^2)代码实现

def bucketSort(nums, n):
    # 抉择一个最大的数
    if max(nums) > len(nums):
        n = max(nums)
    else:
        n = len(nums) + 1
    mid = max(nums) // n
    if mid == 0:
        mid = 1
    # 创立一个元素全是 0 的列表, 当做桶
    bucket = [[] for i in range(n + 1)]
    # 把所有元素放入桶中
    for i in nums:
        bucket[int(i / mid)].append(i)
    print(bucket)
    sort_nums = []
    # 取出桶中的元素
    for j in range(len(bucket)):
        if len(bucket[j]) != 0:
            # 应用递归持续桶排序
            if len(bucket[j]) >= 2 and len(set(nums)) != 1:
                bucket[j] = bucketSort(bucket[j], n)
            # 取出排序好的元素
            for y in bucket[j]:
                sort_nums.append(y)
    return sort_nums
nums = [5, 6, 3, 2, 1, 2, 0, 8, 0, 65]
print(bucketSort(nums, 5))

计数排序

定义:计数排序不是基于比拟的排序算法,其外围在于将输出的数据值转化为键存储在额定开拓的数组空间中。作为一种线性工夫复杂度的排序,计数排序要求输出的数据必须是有确定范畴的整数。(On+k) 代码实现

def countSort(arr):
    # 输入序列
    if max(arr) > len(arr):
        n = max(arr) + 1
    else:
        n = len(arr) + 1
    output = [0 for i in range(n)]
    # 计数序列
    count = [0 for i in range(n)]
    for i in arr:
        count[i] += 1
    for i in range(len(arr)):
        count[i + 1] += count[i]
    print(count)
    for i in range(len(arr)):
        # 下标从 0 开始
        output[count[arr[i]] - 1] = arr[i]
        count[arr[i]] -= 1
    return (output[:len(arr)])
arr = [5,6,3,2,1,2,0,8,0]
ans = countSort(arr)
print(ans)
################# 字母排序 ##################
def countSort(arr):
    n = len(arr)
    # 输入序列
    output = [0 for i in range(256)]
    # 计数序列
    count = [0 for i in range(256)]
    ans = ["" for i in range(n)]
    for i in arr:
        count[ord(i)] += 1
    for i in range(256):
        count[i] += count[i - 1]
    for i in range(n):
        # 下标从 0 开始
        output[count[ord(arr[i])] - 1] = arr[i]
        count[ord(arr[i])] -= 1
    for i in range(len(arr)):
        ans[i] = output[i]
    return ans
arr = "wwwrunoobcom"
ans = countSort(arr)
print("字符数组排序 %s" % ("".join(ans)))

抉择排序

定义:

抉择排序(Selection sort)是一种简略直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,寄存到排序序列的起始地位,而后,再从残余未排序元素中持续寻找最小(大)元素,而后放到已排序序列的开端。以此类推,直到所有元素均排序结束。

抉择排序的次要长处与数据挪动无关。如果某个元素位于正确的最终地位上,则它不会被挪动。抉择排序每次替换一对元素,它们当中至多有一个将被移到其最终地位上,因而对 n 个元素的表进行排序总共进行至少 n - 1 次替换。在所有的齐全依附替换去挪动元素的排序办法中,抉择排序属于十分好的一种。(On^2)

代码实现:

def selection_sort(alist):
    n = len(alist)
    for i in range(n-1):
        # 记录最小地位
        min_index = i
        for j in range(i+1, n):
            if alist[j] < alist[min_index]:
                min_index = j
        # 如果抉择出的数据不在正确地位,进行替换
        if min_index != i:
            alist[i], alist[min_index] = alist[min_index], alist[i]
alist = [54,226,93,17,77,31,44,55,20]
selection_sort(alist)
print(alist)

这样的排序形式,你学废了吗?

退出移动版