📜  算法|排序|问题6(1)

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

算法 | 排序 | 问题6

排序是计算机科学中最基本的算法之一。排序就是将一组数据或记录以某种递增或递减的方式进行排列的过程。对于排序算法的研究始于20世纪初,经过了一个漫长的发展历程,现在已经发展成为计算机科学中的一个重要分支。

在排序中,有一个很重要的指标是时间复杂度。时间复杂度是算法分析中最为重要的一个指标,即一个算法所需要的计算时间。在排序中,时间复杂度代表的是排序算法的计算复杂度。排序算法的时间复杂度可以分为三类:最佳情况(时间复杂度最小)、最坏情况(时间复杂度最大)、平均情况(期望的时间复杂度)。

常见的排序算法有:

  1. 冒泡排序

冒泡排序是一种简单的排序算法。其基本思想是:重复地遍历要排序的序列,一次比较两个元素,如果它们的顺序错误就交换它们的位置。直到没有需要交换的元素为止。

代码实现:

def bubble_sort(arr):
    n = len(arr)

    # 遍历所有数组元素
    for i in range(n):

        # 最后 i 位已经排好,无需再排序
        for j in range(0, n-i-1):

            # 如果当前元素比下一个元素大,则交换位置
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
  1. 快速排序

快速排序是一种基于分治技术的排序算法,其基本思想是:从数列中挑出一个元素作为基准点,将数列中该元素之前的比它小的元素放在它前面,之后的比它大的元素放在它后面。这个过程就称为一次划分,之后再分别对两个子序列进行快排。

代码实现:

def quick_sort(arr, left, right):
    if left < right:
        # 获取枢轴位置
        pivot = partition(arr, left, right)

        # 对枢轴左边进行快速排序
        quick_sort(arr, left, pivot - 1)

        # 对枢轴右边进行快速排序
        quick_sort(arr, pivot + 1, right)

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
  1. 归并排序

归并排序是一种基于分治技术的排序算法。它的基本思想是将两个已经排序的子序列归并成一个大的有序序列。

代码实现:

def merge_sort(arr):
    if len(arr) > 1:
        # 将序列分为两半
        mid = len(arr) // 2
        left_arr = arr[:mid]
        right_arr = arr[mid:]

        # 对两半分别进行排序
        merge_sort(left_arr)
        merge_sort(right_arr)

        # 归并
        i = j = k = 0
        while i < len(left_arr) and j < len(right_arr):
            if left_arr[i] < right_arr[j]:
                arr[k] = left_arr[i]
                i += 1
            else:
                arr[k] = right_arr[j]
                j += 1
            k += 1

        while i < len(left_arr):
            arr[k] = left_arr[i]
            i += 1
            k += 1

        while j < len(right_arr):
            arr[k] = right_arr[j]
            j += 1
            k += 1

以上是三种常见的排序算法,每一种排序算法都有自己的特点和适用场景。在实际工作中,我们需要根据不同的数据规模和数据特点选择不同的排序算法,并且需要对算法的时间复杂度进行分析,以便选择最优的算法。