アルゴリズム復習ヒープソート、バケットソートの三日目

今日は、筆記試験に参加したemmmmmmm、ハードな努力を続けました。

良い習慣:明確な思考は、コードラピッドプロトタイピングを行うことができます。コードより読みやすいが所有を作るために適切なコメント。説明するために、チャートやアクションフィギュアを行うための適切なツールを準備します。

1、バケットソート

「」「
アイデア:これは、元の配列対応するタブ(インデックス= NUM)は、次にバケットから除去された実行を開始する(MAX + 1)番目の空のバケットを設定し、最大値を見つけるために整数の配列です。
」 " "

def bucket_sort_func(arr):
    if len(arr) < 2:
        return arr
    max_arr = max(arr)
    # 放空桶
    bucket = [0 for _ in range(max_arr+1)]
    for num in arr:
        bucket[num] += 1
    sort_arr = []
    for i in range(len(bucket)):
        if bucket[i] != 0:
            for ele in range(bucket[i]):
                sort_arr.append(i)
    return sort_arr

# 放回原数组
def bucket_sort(arr):
    res = bucket_sort_func(arr)
    for i in range(len(arr)):
        arr[i] = res[i]

2、ヒープソート

「」「
アイデア:最初の大きなヒープの根、建設のルートプロセスに大きな杭、修復プロセスに大きな根ヒープであるか理解
「」」

def heap_sort(arr):
    if len(arr) < 2:
        return arr
    for i in range(len(arr)):
        heap_insert(arr, i)
    size = len(arr)
    size -= 1
    arr[0], arr[size] = arr[size], arr[0]

    while size > 0:
        heapify(arr, 0, size)
        size -= 1
        arr[0], arr[size] = arr[size], arr[0]


def heap_insert(arr, index):
    # 构造大根堆
    # 出现一个BUG,最后一个数没有排好,问题见以下描述。必须要int,整除不可以!
    # index = 0
    # a = int((index - 1) / 2)
    # b = (index - 1) // 2
    # print(a, b)   打印结果 a=0,b=-1
    # while arr[index] > arr[((index-1)//2)]:
    #     arr[index], arr[((index-1)//2)] = arr[((index-1)//2)], arr[index]
    #     index = ((index-1)//2)
    while arr[index] > arr[int((index-1)/2)]:
        arr[index], arr[int((index-1)/2)] = arr[int((index-1)/2)], arr[index]
        index = int((index-1)/2)


def heapify(arr, index, size):
    # 调节大根堆
    left = index*2 + 1
    while left < size:
        if (left+1) < size and arr[left+1] > arr[left]:
            largest = left + 1
        else:
            largest = left
        if arr[largest] > arr[index]:
            largest = largest
        else:
            largest = index
        if largest == index:
            break
        arr[largest], arr[index] = arr[index], arr[largest]
        index = largest
        left = index*2 + 1

3、バケットソート拡大

タイトル:必要に応じて、所要時間複雑性O(N)の隣接する二つの最大数との差をソートした後、整数の配列を与えられ、要求はノンソートベースと比較することができません。
「」「
アイデア:max及び最小放電空バケット、ブール値が最小、最大、浴槽内部パラメータを更新、アレイに実行を開始するに入れ、空であるかどうかを決定することを含むことができるバケット
」「」

# 待后续补充

トピック2:指定された配列の中央値を見つけます。
「」「
アイデア:大根ヒープ、少しヒープルート、維持するために
バランスを!」「」

# 待后续补充

おすすめ

転載: www.cnblogs.com/burry/p/12664076.html