欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

几种排序方法

程序员文章站 2022-05-13 19:36:22
...

冒泡排序

def bubblesort(mylist):
    mylen = len(mylist)
    for i in range(mylen-1):
        for j in range(i+1, mylen):
            if mylist[i] > mylist[j]:
                mylist[i], mylist[j] = mylist[j], mylist[i]
    return mylist

快排

采用了分治思想,难理解的是partition算法,其以最数组最右侧位置的数作为基准,将数组分为小于该基准和大于等于该基准的两个子数组。
网上大部分的partition的实现版本在算法导论上有讲,但不好懂。

本partion实现版本里,从左右两侧分别进行,左侧记录大于基准值的位置,右侧记录小于基准值的位置,当两个位置都找到则互换,直到两个指针指向同一个位置。

def quicksort(array, l, r):
    
    def partition(array, l, r):
        q = l - 1
        x = array[r]
        i, j = l, r-1
        while i < j:
            while array[i] < x and i < j:
                i += 1
            while array[j] >= x and i < j:
                j -= 1
            if j > i:
                array[i], array[j] = array[j], array[i]
        if array[i] >= x:
            array[i], array[r] = array[r], array[i]
        return i     
        
    if l < r:
        q = partition(array, l, r)
        quicksort(array, l, q-1)
        quicksort(array, q+1, r)

归并排序

如下归并排序的代码里,merge函数里采用了一个辅助数组temp,用来存储排序后的数组,然后再拷贝到原数组。由于排序的复杂度是n,拷贝也是n,因此复杂度是2n。

def mergesort(array, l, r):
    if len(array) <= 1 or not l < r:
        return
    mid = int((l + r)/2)
    mergesort(array, l, mid)
    mergesort(array, mid+1, r)
    merge(array, l, r)
    
def merge(array, l, r):
    mid = int((l + r)/2)
    i, j = l, mid + 1
    temp = []
    while i <= mid and j <= r:
        if array[i] <= array[j]:
            temp.append(array[i])
            i += 1
        else:
            temp.append(array[j])
            j += 1
    while i <= mid:
        temp.append(array[i])
        i += 1
    while j <= r:
        temp.append(array[j])
        j += 1
    for i in range(l, r + 1):
        array[i] = temp[i-l]