面试常问的六大排序算法

先把代码贴上来,以后我会详细解释每一种排序的原理,以下每种代码都经过了验证和代码简化。

1.冒泡排序

def bubble_sort(nums):
    for i in range(len(nums)):
        for j in range(len(nums)-i-1):
            if nums[j] > nums[j+1]:
                nums[j],nums[j+1] = nums[j+1],nums[j]
    return nums

2.插入排序

def insert_sort(nums):
    for i in range(1, len(nums)):
        key = nums[i]
        j = i - 1
        while j >= 0:
            if nums[j] > key:
                nums[j + 1] = nums[j]
                nums[j] = key
            j -= 1
    return nums

3.快速排序

def quick_sort(nums, l, r):
    if l < r:
        q = partition(nums, l, r)
        quick_sort(nums, l, q - 1)
        quick_sort(nums, q + 1, r)

def partition(nums, l, r):
    x = nums[r]
    i = l - 1
    for j in range(l, r):
        if nums[j] <= x:
            i += 1
            nums[i], nums[j] = nums[j], nums[i]
    nums[i + 1], nums[r] = nums[r], nums[i+1]
    return i + 1

4.归并排序

def merge(left, right):
    i, j = 0, 0
    result = []
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

def merge_sort(nums):
    if len(nums) <= 1:
        return nums
    mid = len(nums) // 2  
    left = merge_sort(nums[:mid])
    right = merge_sort(nums[mid:])
    return merge(left, right)

5.选择排序

def selection_sort(nums):
    n = len(nums)
    for i in range (n):
        min = i
        for j in range(i+1,n):
            if nums[j] < nums[min]:
                min=j
        if min != i:
            nums[min], nums[i] = nums[i], nums[min]
    return nums

6.堆排序

def heap_sort(list):
    # 创建最大堆
    for start in range(len(list) // 2 - 1, -1, -1):
        sift_down(list, start, len(list) - 1)

    # 堆排序
    for end in range(len(list) - 1, 0, -1):
        list[0], list[end] = list[end], list[0]
        sift_down(list, 0, end - 1)
        print(list)
    return list

# 最大堆调整
def sift_down(lst, start, end):
    root = start
    while True:
        child = 2 * root + 1
        if child > end:
            break
        if child + 1 <= end and lst[child] < lst[child + 1]:
            child += 1
        if lst[root] < lst[child]:
            lst[root], lst[child] = lst[child], lst[root]
            root = child
        else:
            break

猜你喜欢

转载自blog.csdn.net/cuicheng01/article/details/81227512