常见排序算法Python实现

冒泡排序:

最优时间复杂度:O(n)
最坏时间复杂度:O(n^2)
稳定性:稳定

def bubble_sort(alist):
    """冒泡排序"""
    for j in range(len(alist)-1, 0, -1):
        count = 0
        for i in range(j):
            if alist[i] > alist[i+1]:
                alist[i], alist[i+1] = alist[i+1], alist[i]
                count += 1
        if count == 0:
            break
    return alist 

选择排序:

最优时间复杂度:O(n^2)
最坏时间复杂度:O(n^2)
稳定性:不稳定

def choose_sort(alist):
    """选择排序"""
    for i in range(len(alist)):
        min_x = alist[i]
        min_pos = i
        for j in range(i+1, len(alist)):
            if alist[j] < min_x:
                min_x = alist[j]
                min_pos = j
        alist[min_pos], alist[i] = alist[i], alist[min_pos]
    return alist

插入排序:

最优时间复杂度:O(n)
最坏时间复杂度:O(n^2)
稳定性:稳定

def insert_sort(alist):
    """插入排序"""
    for j in range(1, len(alist)):
        for i in range(j, 0, -1):
            if alist[i] < alist[i-1]:
                alist[i], alist[i-1] = alist[i-1], alist[i]
            else:
                break
    return alist

希尔排序:

最优时间复杂度:根据步长而调整
最坏时间复杂度:O(n^2)
稳定性:不稳定

def shell_sort(alist):
    """希尔排序"""
    gap = len(alist) // 2
    #gap到0之前,插入算法执行的次数
    while gap >= 1:
        #插入算法,与普通插入算法区别在于gap步长
        for j in range(gap, len(alist)):
            i = j
            while i > 0:
                if alist[i] < alist[i-gap]:
                    alist[i], alist[i-gap] = alist[i-gap], alist[i]
                    i -= gap
                else:
                    break
        #调整步长
        gap = gap // 2
    
    return alist

快速排序:

最优时间复杂度:O(nlogn)
最坏时间复杂度:O(n^2)
稳定性:不稳定

def quick_sort(alist, first, last):
    """快速排序"""
    if first >= last:
        return
    low = first
    high = last 
    
    mid = alist[low]
    
    while low < high:
        #high 左移
        while low < high and alist[high] >= mid:
            high -= 1
        alist[low] = alist[high]

        #low 右移
        while low < high and alist[low] < mid:
            low += 1
        alist[high] = alist[low]

    alist[low] = mid
    
    quick_sort(alist, first, low-1)
    quick_sort(alist, low+1, last)
        

归并排序:


最优时间复杂度:O(nlogn)
最坏时间复杂度:O(nlogn) 
稳定性:稳定

def merge_sort(alist):
    """归并排序"""
    n = len(alist)
    if n == 1:
        return alist
    
    mid = n // 2
    left_li = merge_sort(alist[:mid])
    right_li = merge_sort(alist[mid:])
    
    left_pointer, right_pointer = 0, 0
    result = []
    
    while left_pointer <len(left_li) and right_pointer < len(right_li): 
        if left_li[left_pointer] < right_li[right_pointer]:
            result.append(left_li[left_pointer])
            left_pointer += 1
        
        else:
            result.append(right_li[right_pointer])
            right_pointer += 1
    
    result += left_li[left_pointer:]
    result += right_li[right_pointer:]
    
    return result

猜你喜欢

转载自blog.csdn.net/qq_43235359/article/details/89785965