上次实现了几个排序方式,这次我们继续往下再来写一下其他的排序方式
插入排序
定义:
插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对未排序数据,在已排中从前向后扫描,找到相应位置并插入。(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)
这样的排序方式,你学废了吗?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。