Python 快速归并堆基数排序

1、快速排序

  (1 数列中选择基准数字

  (2 其他元素与基准比较,比基准小的放左边,大的放右边

  (3 递归(2) 

#快排
def quick_sort(data):
    if (len(data)) < 2: #递归直到数列里面只有一个数
        return data
    else:
        mid = data[len(data)//2] #选取中间数为基准
        left, right = [], [] #定义左右两个数列
        data.remove(mid) #并把基准数从数列里移除
        for num in data: #循环数列
            if num >= mid: #比基准大放右数列
                right.append(num)
            else: #比基准小放左数列
                left.append(num)
        return quick_sort(left) + [mid] + quick_sort(right) #递归
    
data = [1,2,9,10,3,4,7,8,0,5,6]
print(quick_sort(data))

 

2、归并排序

  (1 将数列分为各个子序列,使用中间的基数

  (2 比较两个子序列的值,直到其中一个序列到达结尾

  (3 按照比较的大小依次存入数组

#归并排序
#分为子序列
def merge_sort(data):
    if len(data) <= 1: #递归直到只剩一个元素时返回
        return data
    else:
        num = len(data)//2 #选择基数
        left = merge_sort(data[:num]) #左侧序列继续递归
        right = merge_sort(data[num:]) #右侧序列继续递归
        return merge(left, right) #排序
#合并
def merge(left, right): 
    result = [] #定义一个数列存放已排好序的数
    l, r =0, 0
    while l < len(left) and r < len(right): #当左右序列都没有到达尾部时
        if left[l] < right[r]: #如果左序列最小值小于右序列最小值
            result.append(left[l]) #存放值
            l += 1 #左序列下标后移
        else:
            result.append(right[r]) #否则存放右序列最小值
            r += 1 #右序列下标后移
    result  += list(left[l:]) #其中一个到达尾部后,将其余的数存入数组
    result  += list(right[r:])
    return result

data = [1,2,9,10,3,4,7,8,0,5,6]
print(merge_sort(data))

 

3、堆排序

  需要满足父结点 大于 子结点

  (1 建立初始堆

  (2 子结点与父结点比较,若比父结点大则交换

  (3 将堆的顶元素放入最后,纳入有序堆,其他继续建堆

 

#堆排序
def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1 #左孩子
    r = 2 * i + 2 #右孩子
    
    if l < n and arr[l] > arr [i]: #左子结点大于父结点
        largest = l
    
    if r < n and arr[r] > arr[largest]: #右子结点大于父结点
        largest = r
    
    if largest != i: #如果最大值不是父结点
        arr[i], arr[largest] = arr[largest], arr[i] #交换
        
        heapify(arr, n, largest) #继续

def heap_sort(arr):
    n = len(arr)
    
    # 建初始堆
    for i in range(n, -1, -1):
        heapify(arr, n, i)
    
    print(arr)
    
    # 将最大元素纳入有序堆,其余继续比较 循环
    for i in range(n-1, 0, -1): 
        arr[i], arr[0] = arr[0], arr[i]   # 交换
        heapify(arr, i, 0) 

arr = [ 18, 8, 5, 39, 20, 10] 
heap_sort(arr) 
n = len(arr) 
print ("排序后") 
print(arr)
    

 

4、基数排序

就是从个位数开始按照0-9顺序排,依次是十位数,百位数....

  (1  找出最大数位数

  (2 从个位数开始循环 将排好序的数字放入字典中(桶排序方法)

  (3 再将数字从桶中依次取出,放入数组

#基数排序
import math
def radix_sort(arr):
    count = 1
    max_num = max(arr) #最大的数
    
    while max_num > 10**count: #求最大位数
        count =  count + 1 
    
    n = 0
    while n < count : #循环到最大位数
        bucket = {} #方便进行桶排序
        for i in range(0,10): #开始之前清空桶
            bucket.setdefault(i,[])
        
        for num in arr: #按照0-9放入相对应的桶中
            index = int((num/(10**n))%10)
            bucket[index].append(num)
        
        k = 0
        for i in range(10): #0-9的桶中去除数字
            length = len(bucket[i]) 
            if length != 0: #若桶中非空
                for num in bucket[i]: #将数依次放入数组
                    arr[k] = num
                    k = k+1
        n = n+1
        

if __name__ == '__main__':
    arr = [ 19, 18, 18, 8, 5, 39, 20, 10] 
    print(arr)
    radix_sort(arr)
    print(arr)    
    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
希尔排序: ```python def shell_sort(arr): n = len(arr) gap = n // 2 while gap > 0: for i in range(gap, n): temp = arr[i] j = i while j >= gap and arr[j-gap] > temp: arr[j] = arr[j-gap] j -= gap arr[j] = temp gap //= 2 return arr ``` 快速排序: ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` 归并排序: ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right) def merge(left, right): result = [] i, j = 0, 0 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 ``` 排序: ```python def heapify(arr, n, i): largest = i l = 2 * i + 1 r = 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 heap_sort(arr): n = len(arr) for i in range(n//2 - 1, -1, -1): 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 ``` 计数排序: ```python def counting_sort(arr): max_value = max(arr) counts = [0] * (max_value + 1) result = [0] * len(arr) for x in arr: counts[x] += 1 for i in range(1, max_value + 1): counts[i] += counts[i-1] for i in range(len(arr)): result[counts[arr[i]] - 1] = arr[i] counts[arr[i]] -= 1 return result ``` 桶排序: ```python def bucket_sort(arr): max_value = max(arr) bucket_size = max_value // 10 num_buckets = max_value // bucket_size + 1 buckets = [[] for _ in range(num_buckets)] for x in arr: buckets[x // bucket_size].append(x) result = [] for bucket in buckets: result.extend(sorted(bucket)) return result ``` 基数排序: ```python def radix_sort(arr): max_value = max(arr) digit_count = len(str(max_value)) for digit in range(digit_count): buckets = [[] for _ in range(10)] for x in arr: bucket_index = (x // (10 ** digit)) % 10 buckets[bucket_index].append(x) arr = [] for bucket in buckets: arr.extend(bucket) return arr ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值