📜  数组排序 (1)

📅  最后修改于: 2023-12-03 15:40:03.642000             🧑  作者: Mango

数组排序介绍

在计算机领域,数组排序是一种重要的基础算法。它可以将一个无序的数组按照特定的规则进行排序,使其变得有序。数组排序技术在算法设计、数据统计等领域都有广泛应用。

本文将介绍常见的数组排序算法,包括常见的时间复杂度、算法思想、代码示例以及优化方法等内容。

常见的数组排序算法

在实际开发中,常见的数组排序算法有很多种,包括:

  • 冒泡排序
  • 插入排序
  • 选择排序
  • 快速排序
  • 归并排序
  • 堆排序

下面分别介绍一下这些算法的时间复杂度、算法思想以及代码示例。

冒泡排序

冒泡排序(Bubble Sort)是一种交换排序。它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,知道没有反序为止。

冒泡排序的时间复杂度为 $O(n^2)$,是一种相对低效的排序方式。

代码示例如下:

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
插入排序

插入排序(Insertion Sort)是一种简单直观的排序算法,其基本操作是将一个记录插入到已经排好序的有序序列中。

插入排序的时间复杂度为 $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
选择排序

选择排序(Selection Sort)是一种简单直观的排序算法,其基本操作是在未排序的数列中选择最小的元素,将其与左边的元素交换位置,知道全部排序完毕。

选择排序的时间复杂度为 $O(n^2)$。

代码示例如下:

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
快速排序

快速排序(Quick Sort)是一种轴点分治的排序算法,其基本思想是:选取一个轴点(pivot),通过一趟排序将待排记录分隔成独立的两部分,其中一部分的所有记录都比轴点小,另一部分的所有记录都比轴点大,之后递归的进行排序。

快速排序的时间复杂度为 $O(nlogn)$ ~ $O(n^2)$,在平均情况下表现最优。

代码示例如下:

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

def partition(arr, low, high):
    pivot = arr[low]
    while low < high:
        while low < high and arr[high] >= pivot:
            high -= 1
        arr[low] = arr[high]
        while low < high and arr[low] <= pivot:
            low += 1
        arr[high] = arr[low]
    arr[low] = pivot
    return low
归并排序

归并排序(Merge Sort)是一种分治排序算法,其基本思想是:将待排记录分为若干组,将每组相邻的两个记录进行归并排序,最后形成有序序列。

归并排序的时间复杂度为 $O(nlogn)$。

代码示例如下:

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

def merge(left, right):
    result = []
    i, j = 0, 0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result
堆排序

堆排序(Heap Sort)是一种树形选择排序算法,其基本思想是:利用堆的性质进行排序,首先将数组构造为一个最大堆,然后将堆顶元素(即最大值)与末尾元素交换位置,然后调整堆到新的堆顶元素最大的位置,知道堆为空。

堆排序的时间复杂度为 $O(nlogn)$。

代码示例如下:

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

def heapify(arr, n, i):
    largest = i
    left = i * 2 + 1
    right = i * 2 + 2
    if left < n and arr[left] > arr[largest]:
        largest = left
    if right < n and arr[right] > arr[largest]:
        largest = right
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)
数组排序优化方法

在实际开发中,数组排序也有很多优化的方法,包括:

  • 对长度较小的数组使用插入排序、冒泡排序等,不使用快速排序。
  • 对数据近乎有序的数组使用插入排序,能够达到线性排序的效率。
  • 使用三点取中法找到轴点,减小快排递归次数。
  • 对生成随机数组的过程进行优化,比如使用位运算代替取模运算。

以上方法都能够提高数组排序的效率和实现质量,具体实现可根据需求进行选择。