python实现8大排序

1.冒泡排序

# 第一遍结束,最大的数在最后
def sort(alist):
    for i in range(len(alist)):
        for j in range(i,len(alist)):
            if alist[i] > alist[j]:
                alist[i],alist[j] = alist[j],alist[i]
    return alist
print(sort([3,1,4,2,5]))

2.快速排序

def sort(alist):
    if len(alist) < 2:
        return alist
    base_node = alist.pop(0)
    left_alist = []
    right_alist = []

    for i in alist:
        if i > base_node:
            right_alist.append(i)
        else:
            left_alist.append(i)
    return sort(left_alist) + [base_node] + sort(right_alist)
print(sort([3,10,7,6,9]))

3.简单选择排序

# 比较+交换,每次挑选最小的放在前面
def sort(alist):
    for i in range(len(alist)):
        min_alist_index = i 
        for j in range(i,len(alist)):
            if alist[min_alist_index] > alist[j]:
                min_alist_index = j
        alist[min_alist_index],alist[i] = alist[i],alist[min_alist_index]
    return alist
print(sort([9,1,7,2,5,3]))

4.插入排序

# 向前遍历
def sort(alist):
    for i in range(len(alist)):
        for j in range(0,i):
            if alist[j] > alist[i]:
                alist[j],alist[i] = alist[i],alist[j]
    return alist
print(sort([3,1,2,6,5,7,4]))

5.希尔排序

# 将待排序数组按照步长gap进行分组,
# 然后将每组的元素利用直接插入排序的方法进行排序,每次将gap折半减少,循环以上操作。
# 当gap=1的时候,利用直接插入完成排序
def sort(alist):
    length = len(alist)
    gap = length // 2
    while gap >= 1:
        for j in range(gap,length):
            i = j
            while(i - gap) >= 0:
                if alist[i] < alist[i - gap]:
                    alist[i],alist[i-gap] = alist[i - gap],alist[i]
                    i -= gap
                else:
                    break
        gap //= 2
    return alist
print(sort([4,6,2,1,5,3]))

6.归并排序

# 思想:将N个长度为1的键值,成对合并成N/2个长度为2的键值组
#       将N/2     2                 N/4        4
#         N/4     4                 N/8        8
#         ...
def sort(alist):
    if len(alist) <= 1:
        return alist
    middle = len(alist) // 2
    left_alist = sort(alist[:middle])
    right_alist = sort(alist[middle:])

    i = j = 0
    result_list = []
    while i < len(left_alist) and j < len(right_alist):
        if left_alist[i] <= right_alist[j]:
            result_list.append(left_alist[i])
            i += 1
        else:
            result_list.append(right_alist[i])
            j += 1
    result_list += left_alist[i:]
    result_list += right_alist[j:]

    return result_list
print(sort([4,2,6,1,5,3]))

7.桶排序

def tong_sort(alist):
    max_num = max(alist) # 选择一个最大的数
    bucket = [0]*(max_num+1) # 创建一个元素全为0的列表。当做桶。

    for i in alist:  # 把所有元素放入桶中,即把对应的元素个数加一
        bucket[i] += 1
        sort_nums = []  # 存储桶中的元素

    for j in range(len(bucket)):   # 取出桶中的元素
        if bucket[j] != 0:
            for y in range(bucket[j]):
                sort_nums.append(j)
    return sort_nums
print(tong_sort([5,3,1,4,2,6]))

8.堆排序

def heapify_sort(alist,n,i):
    largest = i
    left = 2 * i + 1  
    right = 2 * i + 2

    if left < n and alist[i] < alist[left]:
        largest = left

    if right < n and alist[largest] < alist[right]:
        largest = right

    if largest != i:
        alist[i],alist[largest] = alist[largest],alist[i] # 交换 

        heapify_sort(alist,n,largest)

def heap_sort(alist):
    n = len(alist)

    for i in range(n,-1,-1):
        heapify_sort(alist,n,i)

    # 一个个的交换元素
    for i in range(n-1,0,-1):
        alist[i],alist[0] = alist[0],alist[i] # 交换
        heapify_sort(alist,i,0)

alist = [12,11,13,5,4,6]
heap_sort(alist)
n = len(alist)
for i in range(n):
    print(alist[i])
原文地址:https://www.cnblogs.com/even160941/p/15128747.html