欢迎访问宙启技术站
智能推送

用Python实现各种排序算法函数

发布时间:2023-06-23 12:42:31

排序算法是计算机科学中的一类重要算法,用于排序一系列元素的顺序。在实际应用中,我们经常需要对数据进行排序,例如搜索引擎根据搜索词的相关性对搜索结果进行排序,电商网站对商品进行价格或销量排序等等。Python语言是一种非常适合实现各种排序算法的编程语言,下面我们将逐一介绍并实现常见的排序算法。

1. 冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历数列,每次比较相邻两个元素,如果前一个元素大于后一个元素,就交换两个元素的位置。每一轮遍历都可以确定一个元素的最终位置。它的时间复杂度为O(n^2)。

实现代码如下:

def bubble_sort(array):
    n = len(array)
    for i in range(n):
        for j in range(0, n-i-1):
            if array[j] > array[j+1]:
                array[j], array[j+1] = array[j+1], array[j]

2. 选择排序

选择排序是一种简单直观的排序算法,它每次从待排序序列中选择最小的元素,并与序列中的 个元素交换位置。重复这个过程,直到序列排序完成。它的时间复杂度也是O(n^2)。

实现代码如下:

def selection_sort(array):
    n = len(array)
    for i in range(n):
        min_index = i
        for j in range(i+1, n):
            if array[j] < array[min_index]:
                min_index = j
        array[i], array[min_index] = array[min_index], array[i]

3. 插入排序

插入排序是一种简单直观的排序算法,它将待排序序列分成已排序和未排序两部分,每次从未排序部分选择一个元素插入已排序部分的正确位置。它的时间复杂度也是O(n^2)。

实现代码如下:

def insertion_sort(array):
    n = len(array)
    for i in range(1, n):
        key = array[i]
        j = i-1
        while j >= 0 and array[j] > key:
            array[j+1] = array[j]
            j -= 1
        array[j+1] = key

4. 希尔排序

希尔排序采用分组插入排序的思想,先将整个待排序序列分成若干个子序列分别进行插入排序,然后再对整个序列进行插入排序。它的时间复杂度取决于选取的增量序列,最坏情况下的时间复杂度为O(n^2)。

实现代码如下:

def shell_sort(array):
    n = len(array)
    gap = n // 2
    while gap > 0:
        for i in range(gap, n):
            temp = array[i]
            j = i
            while j >= gap and array[j-gap] > temp:
                array[j] = array[j-gap]
                j -= gap
            array[j] = temp
        gap //= 2

5. 归并排序

归并排序采用分治思想,将待排序序列分成两个子序列,分别对子序列进行排序,然后将两个已排好序的子序列合并起来。它的时间复杂度为O(nlogn)。

实现代码如下:

def merge_sort(array):
    if len(array) > 1:
        mid = len(array) // 2
        left = array[:mid]
        right = array[mid:]
        merge_sort(left)
        merge_sort(right)
        i = j = k = 0
        while i < len(left) and j < len(right):
            if left[i] < right[j]:
                array[k] = left[i]
                i += 1
            else:
                array[k] = right[j]
                j += 1
            k += 1
        while i < len(left):
            array[k] = left[i]
            i += 1
            k += 1
        while j < len(right):
            array[k] = right[j]
            j += 1
            k += 1

6. 快速排序

快速排序采用分治思想,每次选取一个基准元素将待排序序列分成两个子序列,其中一个子序列中的所有元素都比基准元素小,另一个子序列中的所有元素都比基准元素大。然后对两个子序列进行排序。它的时间复杂度为O(nlogn)。

实现代码如下:

def quick_sort(array, low, high):
    if low < high:
        pivot = partition(array, low, high)
        quick_sort(array, low, pivot-1)
        quick_sort(array, pivot+1, high)

def partition(array, low, high):
    pivot = array[high]
    i = low
    for j in range(low, high):
        if array[j] < pivot:
            array[i], array[j] = array[j], array[i]
            i += 1
    array[i], array[high] = array[high], array[i]
    return i

7. 堆排序

堆排序采用建堆和调整堆两个过程,在建堆过程中,将待排序序列转化成一个大顶堆或小顶堆,然后将堆顶元素和堆底元素交换位置并将堆底元素移除,然后对剩余的元素重新进行堆调整。它的时间复杂度为O(nlogn)。

实现代码如下:

def heap_sort(array):
    n = len(array)
    for i in range(n//2-1, -1, -1):
        heapify(array, n, i)
    for i in range(n-1, 0, -1):
        array[i], array[0] = array[0], array[i]
        heapify(array, i, 0)

def heapify(array, n, i):
    largest = i
    left = 2 * i + 1
    right = 2 * i + 2
    if left < n and array[largest] < array[left]:
        largest = left
    if right < n and array[largest] < array[right]:
        largest = right
    if largest != i:
        array[i], array[largest] = array[largest], array[i]
        heapify(array, n, largest)

总结

这里我们介绍并实现了常见的七种排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序和堆排序。虽然它们的时间复杂度不同,但是它们都是基于比较的排序算法,其时间复杂度的下限是O(nlogn)。除此之外,还有一些非基于比较的排序算法,例如桶排序、计数排序和基数排序,它们的时间复杂度可以达到O(n),但是它们的应用范围有限。在实际开发中,我们需要根据具体问题选择合适的排序算法。