码迷,mamicode.com
首页 > 编程语言 > 详细

python实现排序的几种算法

时间:2021-04-15 12:18:58      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:pivot   最大值   heapsort   依次   冒泡   大小   video   交换   选择   

# 1. 选择排序:循环找最小值,依次放在左侧
def select_sort(arr):
    for i in range(len(arr)-1):
        min_index = i
        for j in range(i+1, len(arr)):
            if arr[j] < arr[min_index]:
                min_index = j
        if i != min_index:
            # 交换两个元素位置
            arr[i], arr[min_index] = arr[min_index], arr[i]
    return arr


# 2. 冒泡排序
# 和插入排序相同点: 都是循环比较相邻的两个元素
# 不同点:每次循环只会和后面的一个元素比大小,不会和前面的元素比较
# 特点: 每次循环把最大值依次放在后面
def bubble_sort(arr):
    for i in range(1, len(arr)):
        for j in range(0, len(arr)-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr


# 3. 插入排序:
# 循环比较相邻的两个元素,小的放左边;如果交换后发现左侧还有小元素,继续交换位置

def insert_sort(arr):
    for i in range(len(arr)):
        pre_index = i - 1
        current = arr[i]
        while pre_index >= 0 and arr[pre_index] > current:
            arr[pre_index+1] = arr[pre_index]
            pre_index -= 1
        arr[pre_index+1] = current
    return arr


# 4. 希尔排序,插入排序的升级
def shell_sort(arr):
    meta = 2
    n = len(arr)
    gap = int(n // meta)
    while gap > 0:
        for i in range(gap, n):
            current = arr[i]
            j = i - gap
            while j >= 0 and arr[j] > current:
                arr[j+gap] = arr[j]
                j -= gap
            arr[j+gap] = current

        gap = int(gap//meta)
    return arr


# 5. 快速排序
def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[-1]  # 取最后一个数作为pivot
    i = 0  # i记录比pivot小的数的个数
    j = 0  # j用来遍历整个数列
    n = len(arr)

    while j < n-1:
        if arr[j] < pivot:   # 比pivot小的放前面
            arr[i], arr[j] = arr[j], arr[i]
            i += 1
        j += 1
    arr[i], arr[-1] = arr[-1], arr[i]

    if i > 0:
        # 比pivot小的数据不为空, 则对其进行快速排序
        arr[:i] = quick_sort(arr[:i])
    if i+1 < n:
        # 比pivot大的数据不为空, 则对其进行快速排序
        arr[i+1:] = quick_sort(arr[i+1:])
    return arr


# 6. 归并排序
def mergeSort(arr):
    if len(arr) < 2:
        return arr
    middle = len(arr) // 2
    left, right = arr[0:middle], arr[middle:]
    return merge(mergeSort(left), mergeSort(right))

def merge(left, right):
    result = []
    while left and right:
        if left[0] <= right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
    while left:
        result.append(left.pop(0))
    while right:
        result.append(right.pop(0))
    return result


# 7. 堆排序, 理解视频:https://www.bilibili.com/video/BV1Eb41147dK?from=search&seid=4983284716020974089
def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1  # left = 2*i + 1
    r = 2 * i + 2  # right = 2*i + 2

    if l < n and arr[i] < arr[l]:
        largest = l

    if r < n and arr[largest] < arr[r]:
        largest = r

    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]  # 交换
        heapify(arr, n, largest)


def heapSort(arr):
    n = len(arr)

    # Build a maxheap.
    for i in range(n, -1, -1):  # 递减的时候,第2个值-1表示到0结束,包括0
        heapify(arr, n, i)

        # 一个个交换元素
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # 交换
        heapify(arr, i, 0)
    return arr


# 8.计数排序
# https://blog.csdn.net/weixin_43790276/article/details/107398262
def counting_sort(arr):
    if len(arr) < 2:
        return arr
    max_num = max(arr)
    count = [0] * (max_num + 1)  # 新建一个计数列表,长度为待排序列表最大值加1。
    for num in arr:
        count[num] += 1  # 把待排序元素值当作count列表的下标,计算每个待排序元素重复的次数
    new_arr = list()
    for i in range(len(count)):
        for j in range(count[i]):  # count[i]就是count列表中元素i重复的次数
            new_arr.append(i)
    return new_arr


# 9 基数排序

# coding=utf-8
def radix_sort(array):
    # 找出带排序元素最大数有几位
    max_num = max(array)
    place = 1
    while max_num >= 10**place:
        place += 1

    for i in range(place):
        # 当i=0时,找个位的基数都有哪些;当i=1时,找十位的基数都有哪些
        buckets = [[] for _ in range(10)]
        for num in array:
            radix = int(num/(10**i) % 10)
            buckets[radix].append(num)

        # 按基数对元素进行排序
        j = 0
        for k in range(10):
            for num in buckets[k]:
                array[j] = num
                j += 1
    return array



a = [1, 4, 9, 3, 5]
# x = bubble_sort(a)
#x = mergeSort(a)
#x = heapSort(a)
x = counting_sort(a)
print(x)

 

python实现排序的几种算法

标签:pivot   最大值   heapsort   依次   冒泡   大小   video   交换   选择   

原文地址:https://www.cnblogs.com/regit/p/14659372.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!