📜  排序 (1)

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

排序算法简介

排序算法是计算机科学中的一种重要算法。排序算法将数据元素按照特定的顺序进行排列,以便于后续的查找、统计以及数据处理等操作。在实际应用中,排序算法被广泛应用于数据处理、数据挖掘、搜索引擎、图形处理等领域。

排序算法可以有多种不同的实现方式,不同的实现方式有着不同的时间复杂度和空间复杂度。在实际应用中,需要根据数据量以及计算资源的限制,选择最合适的排序算法以达到最快的排序效果。

常见的排序算法

以下是常见的排序算法以及它们的时间复杂度:

冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法,它的时间复杂度为O(N^2)。冒泡排序的主要思想是依次比较相邻的两个元素,若它们的顺序不符合要求,则互换位置。这样一来,每一轮比较都会将最大的元素放到最后的位置,因此每一轮比较都可以减少一次比较次数。

def bubbleSort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1] :
                arr[j], arr[j+1] = arr[j+1], arr[j]
选择排序(Selection Sort)

选择排序是一种简单的排序算法,它的时间复杂度也为O(N^2)。选择排序的主要思想是标记当前未排序的列表中的最小值,然后将它和未排序的列表中的第一个元素互换位置。不断重复这个过程,直到所有的元素都被排序。

def selectionSort(arr):
    n = len(arr)
    for i in range(n):
        # Find the minimum element in remaining 
        # unsorted array
        min_idx = i
        for j in range(i+1, n):
            if arr[min_idx] > arr[j]:
                min_idx = j
              
        # Swap the found minimum element with 
        # the first element        
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
插入排序(Insertion Sort)

插入排序是一种简单但有效的排序算法,它的时间复杂度为O(N^2)。插入排序的主要思想是将一个元素插入到已排序的序列中的正确位置。具体地说,它从第二个元素开始,依次向前比较,直到找到它需要插入的位置。

def insertionSort(arr):
    n = len(arr)
    for i in range(1, n):
        key = arr[i]
        j = i-1
        while j >=0 and key < arr[j] :
                arr[j+1] = arr[j]
                j -= 1
        arr[j+1] = key
快速排序(Quick Sort)

快速排序是一种常见的排序算法,它的时间复杂度为O(NlogN)。快速排序的主要思想是通过选定一个元素(称之为“枢轴”),将序列划分成两个子序列,左边的所有元素小于枢轴,右边的所有元素大于枢轴。然后对这两个子序列进行递归排序。

def partition(arr, low, high):
    i = ( low-1 )         # 最小元素索引
    pivot = arr[high]     # 设定枢轴
    for j in range(low , high):
        # 如果当前元素小于或等于枢轴
        if arr[j] <= pivot:
            i = i+1
            arr[i], arr[j] = arr[j], arr[i]
 
    arr[i+1], arr[high] = arr[high], arr[i+1]
    return (i+1)
    
def quickSort(arr, low, high):
    if low < high:
 
        # pi 是划分元素的索引,arr[p]现在排列在正确的位置
        pi = partition(arr, low, high)
 
        # 对划分的两个子数组递归进行排序
        quickSort(arr, low, pi-1)
        quickSort(arr, pi+1, high)
堆排序(Heap Sort)

堆排序是一种基于堆结构的排序算法,它的时间复杂度为O(NlogN)。堆排序的主要思想是通过将序列看成是一颗二叉树(称之为“堆”),将堆顶元素与堆底元素互换位置,然后不断地移动堆顶元素,保证其是最大的元素。

def heapify(arr, n, i):
    largest = i  # Initialize largest as root
    l = 2 * i + 1     # left = 2*i + 1
    r = 2 * i + 2     # right = 2*i + 2
 
    # See if left child of root exists and is
    # greater than root
    if l < n and arr[largest] < arr[l]:
        largest = l
 
    # See if right child of root exists and is
    # greater than root
    if r < n and arr[largest] < arr[r]:
        largest = r
 
    # Change root, if needed
    if largest != i:
        arr[i],arr[largest] = arr[largest],arr[i]  # swap
 
        # Heapify the root.
        heapify(arr, n, largest)
 
# The main function to sort an array of given size
def heapSort(arr):
    n = len(arr)
 
    # Build a maxheap.
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)
 
    # One by one extract elements
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]   # swap
        heapify(arr, i, 0)
总结

以上是常见的排序算法的介绍和实现方式。在实际应用中,选择合适的排序算法对于提高程序的效率有着重要的作用。