record

作者: 翻开日记 | 来源:发表于2018-08-18 14:13 被阅读0次
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 18-7-31 上午11:31
# @File    : Sorts.py
# @Software: PyCharm
# @Author  : wxw
# @Contact : xwwei@lighten.ai
# @Desc    : 各种排序算法

# 插入排序
def InserteSort(arr):
    """插入直到1"""
    if not arr:
        return []
    for i in range(len(arr)):
        for j in range(i, 0, -1):
            if arr[j] < arr[j-1]:
                arr[j], arr[j-1] = arr[j-1], arr[j]
    print(arr)

# 选择排序
def SelectSort(arr):
    if not arr:
        return []
    for start in range(len(arr)):
        amin = start
        for i in range(start, len(arr)):
            if arr[i] < arr[amin]:
                amin = i
        arr[amin], arr[start] = arr[start], arr[amin]
    print(arr)

# 冒泡排序
def BubblingSort(arr):
    """在尾部进行选择排序"""
    if not arr:
        return []
    for end in range(len(arr)-1, -1, -1):
        flag = True
        for i in range(end):
            if arr[i] > arr[i+1]:
                arr[i], arr[i+1] = arr[i+1], arr[i]
                flag = False
        if flag:
            print('--', arr)
    print(arr)

# 快速排序 递归 space(n)
def QuickSort_rec(arr):
    if not arr:
        return []
    target = arr[-1]
    left = [x for x in arr if x < target]
    mid = [x for x in arr if x == target]
    right = [x for x in arr if x > target]
    return QuickSort_rec(left) + mid + QuickSort_rec(right)

# 原地快排, 需要用到partition函数
def QuickSort(arr, left, right):
    if left < right:
        L, R = partition(arr, left, right)
        QuickSort(arr, left, L-1)
        QuickSort(arr, R+1, right)
# space O(1)
def partition(arr, left, right):
    cur = left
    target = right
    while left < right:
        if arr[cur] > arr[target]:
            right -= 1
            arr[cur], arr[right] = arr[right], arr[cur]
        elif arr[cur] == arr[target]:
            cur += 1
        elif arr[cur] < arr[target]:
            arr[cur], arr[left] = arr[left], arr[cur]
            cur += 1
            left += 1
    arr[target], arr[right] = arr[right], arr[target]
    return left, right

# 归并排序 O(nlogn) space O(n)
def mergeSort(arr):
    if len(arr) < 2:
        return arr
    mid = len(arr) // 2
    left = mergeSort(arr[:mid])
    right = mergeSort(arr[mid:])
    result = []
    while left and right:
        if left[0] > right[0]:
            result.append(right.pop(0))
        else:
            result.append(left.pop(0))
    if left:
        result += left
    if right:
        result += right
    return result

# !!!堆排序
# 大的向上跑
def heapCreate(arr, idx):
    """组建大根堆"""
    while arr[idx] > arr[int((idx - 1) / 2)]:
        arr[idx], arr[int((idx - 1) / 2)] = arr[int((idx - 1) / 2)], arr[idx]
        idx = int((idx - 1) / 2)
# 大的向下跑
def heapify(arr, idx, size):
    """找到最大的放在上面用于交换,放到序列尾部"""
    left = idx * 2 + 1
    while left < size:
        # 左右谁最大
        largest = left + 1 if left + 1 < size and arr[left+1] > arr[left] else left
        # 孩子和父亲谁大
        largest = largest if arr[largest] > arr[idx] else idx
        if largest == idx:
            break
        # 交换
        arr[idx], arr[largest] = arr[largest], arr[idx]
        idx = largest
        left = idx * 2 + 1
def heapSort(arr):
    # O(n)
    for i in range(len(arr)):
        heapCreate(arr, i)
    print("HeapInsert:", arr)
    size = len(arr) - 1
    # O(logn)
    while size > 0:
        arr[0], arr[size] = arr[size], arr[0]
        size -= 1
        heapify(arr, 0, size)
    print(arr)

if __name__ == '__main__':
    import random
    a = [7, 5, 4, 3, 2, 1]
    random.shuffle(a)
    print('raw:', a)
    heapSort(a)

相关文章

网友评论

      本文标题:record

      本文链接:https://www.haomeiwen.com/subject/yqdfiftx.html