​上次实现了几个排序方式,这次我们继续往下再来写一下其他的排序方式

插入排序

定义:

插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对未排序数据,在已排中从前向后扫描,找到相应位置并插入。(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)

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


活在当下
32 声望38 粉丝