排序算法学习

123 阅读2分钟

排序是一种对一组数据按照某个特定的顺序进行排列的操作,常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等。

冒泡排序

冒泡排序是最简单的排序算法之一,它的基本思想是比较相邻的两个元素,如果前面的比后面的大,就交换这两个元素。这样一轮下来就可以把最大的元素放到最后面,接着再进行一轮比较就可以将次大的元素放到倒数第二个位置上,依次类推,直到排序完成。

冒泡排序的时间复杂度为 O(n^2),空间复杂度为 O(1)。

代码示例

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

插入排序

插入排序的思想是将未排序的元素逐个插入到已排序的序列中,这种排序方法类似于玩扑克牌时插牌的过程。插入排序的时间复杂度也为 O(n^2),但是对于基本有序的序列,插入排序的性能比冒泡排序更好。

代码示例

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

选择排序

选择排序的思想是每次从未排序的元素中挑选一个最小的元素,放到已排序数组的末尾。选择排序每次需要扫描整个未排序序列,时间复杂度为 O(n^2),空间复杂度为 O(1)。

代码示例

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

快速排序

快速排序是运用分治思想的一种排序算法,它的基本思想是选择一个基元(pivot),将原数组划分成左右两个子数组,使得左边的元素都小于基元,右边的元素都大于基元,递归地对左右两个子数组进行快速排序。

快速排序的时间复杂度为 O(nlogn),空间复杂度为 O(logn)。

代码示例

def quick_sort(arr, left=None, right=None):
    if left is None:
        left = 0
    if right is None:
        right = len(arr) - 1
    if left >= right:
        return arr
    pivot = partition(arr, left, right)
    quick_sort(arr, left, pivot-1)
    quick_sort(arr, pivot+1, right)
    return arr

def partition(arr, left, right):
    pivot = arr[left]
    while left < right:
        while left < right and arr[right] >= pivot:
            right -= 1
        arr[left] = arr[right]
        while left < right and arr[left] <= pivot:
            left += 1
        arr[right] = arr[left]
    arr[left] = pivot
    return left

归并排序

归并排序是一种基于分治思想的排序算法,它的基本思想是将数组分成两个子数组,分别排序,然后将排好序的子数组合并成一个有序的数组。归并排序也是一种稳定排序算法,它的时间复杂度为 O(nlogn),空间复杂度为 O(n)。

代码示例

def merge_sort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left_arr = merge_sort(arr[:mid])
    right_arr = merge_sort(arr[mid:])
    return merge(left_arr, right_arr)

def merge(left_arr, right_arr):
    left_index, right_index = 0, 0
    result = []
    while left_index < len(left_arr) and right_index < len(right_arr):
        if left_arr[left_index] <= right_arr[right_index]:
            result.append(left_arr[left_index])
            left_index += 1
        else:
            result.append(right_arr[right_index])
            right_index += 1
    result += left_arr[left_index:]
    result += right_arr[right_index:]
    return result

堆排序

堆排序采用堆的思想来进行排序,构建一个最大堆或最小堆,然后逐个从堆中取出元素,就得到了一个有序的序列。堆排序的时间复杂度为 O(nlogn),空间复杂度为 O(1)。

代码示例

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[0], arr[i] = arr[i], arr[0]
        heapify(arr, i, 0)
    return arr

def heapify(arr, n, i):
    largest = i
    left_child = i * 2 + 1
    right_child = i * 2 + 2
    if left_child < n and arr[left_child] > arr[largest]:
        largest = left_child
    if right_child < n and arr[right_child] > arr[largest]:
        largest = right_child
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

总结

以上是一些基本的排序算法以及它们的代码实现,每个算法都有自己的特点和适用范围,选择一种合适的排序算法可以提高算法效率。在实际的开发中,除了自行实现算法外,还可以使用现成的排序函数,例如Python中的sort()函数,可以方便快捷地完成排序操作。