排序算法

1、直接插入排序

def insert(alist):
    n = len(alist)
    for i in range(1, n):
        for j in range(i, 0, -1):
            if alist[j-1] > alist[j]:
                alist[j-1], alist[j] = alist[j], alist[j-1]
    return alist

alist = [4, 5, 2, 3, 1]
alist = insert(alist)
print(alist)

2、希尔排序

def shell(alist):
    n = len(alist)
    gap = n // 2
    while gap > 0:
        for i in range(1, n):
            for j in range(i, 0, -gap):
                if alist[j-gap] > alist[j]:
                    alist[j-gap], alist[j] = alist[j], alist[j-gap]
        gap //= 2
    return alist

alist = [4, 5, 2, 1, 3]
alist = shell(alist)
print(alist)

3、直接选择排序

def select(alist):
    n = len(alist)
    for i in range(n):
        min_i = i
        for j in range(i+1, n):
            if alist[min_i] > alist[j]:
                min_i = j
        alist[i], alist[min_i] = alist[min_i], alist[i]
    return alist

alist = [4, 5, 2, 1, 3]

alist = select(alist)

print(alist)

4、堆排序

def maxheap(alist):

    for i in range(len(alist)//2-1):
        heapify(alist, i)
        
def heapify(alist, i):
    left = 2*i+1
    right = 2*i+2
    largest = i
    if left < n and alist[left]>alist[largest]:
        largest = left
    if right < n and alist[right]>alist[largest]:
        largest = right
    if largest != i:
        swap(alist, i, largest)
        heapify(alist, largest)
        
def swap(alist, i, j):
    alist[i], alist[j] = alist[j], alist[i]
    
def heapsort(alist):
    global n
    n = len(alist)
    maxheap(alist)
    for i in range(n-1, 0, -1):
        swap(alist, 0, i)
        n -= 1
        heapify(alist, 0)
    return alist

alist = [4, 5, 2, 1, 3]
alist = heapsort(alist)
print(alist)

5、冒泡排序

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

alist = [4, 5, 2, 1, 3]
alist = bubble(alist)

print(alist)

6、快速排序

def quick(alist, first, last):
    if first>=last:
        return
    
    mid_value = alist[first]
    low = first
    high = last
    
    while low<high:
        while low<high and alist[high]>=mid_value:
            high -= 1
        alist[low] = alist[high]
        
        while low<high and alist[low]<mid_value:
            low += 1
        alist[high] = alist[low]
        
        alist[low] = mid_value
        
    quick(alist, first, low-1)
    quick(alist, low+1, last)
    
    return alist

alist = [4, 5, 2, 1, 3]
n = len(alist)
alist = quick(alist, 0, n-1)
print(alist)

7、归并排序

def merge(alist):
    n = len(alist)
    if n <= 1:
        return alist
    mid_index = n // 2
    
    left_list = merge(alist[:mid_index])
    right_list = merge(alist[mid_index:])
    
    left_point, right_point = 0, 0
    result = []
    
    while left_point < len(left_list) and right_point < len(right_list):
        if right_list[right_point] < left_list[left_point]:
            result.append(right_list[right_point])
            right_point += 1
        else:
            result.append(left_list[left_point])
            left_point += 1
            
    result += left_list[left_point:]
    result += right_list[right_point:]
    
    return result


alist = [4, 5, 2, 1, 3]
alist = merge(alist)
print(alist)

各种排序算法比较
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值