📜  使用就地排序算法对对象进行排序(1)

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

使用就地排序算法对对象进行排序

在编程中,我们常常需要对一组对象进行排序。通常的排序算法会创建一个新的数组或列表,对其进行排序,然后返回排序后的结果。但是,在某些情况下,我们可能需要使用就地排序算法来原地排序对象,而不创建新的集合。本文将介绍就地排序算法并提供一些示例代码。

什么是就地排序算法?

就地排序算法是一种排序算法,它直接在输入数组或列表中进行排序,并返回排序后的原始数组或列表。在进行排序时,就地排序算法不会创建新的集合,而是使用原始集合中的内存空间来进行排序。因此,就地排序算法通常比非就地排序算法更有效率。

常见的就地排序算法

以下是常用的就地排序算法:

冒泡排序

冒泡排序是一种简单的就地排序算法。它通过重复地交换相邻的元素来排序,直到整个数组都被排序。由于它的工作原理,冒泡排序的平均时间复杂度为O(n^2)。

以下是一个冒泡排序的Python示例:

def bubble_sort(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]
    return arr

arr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
print(arr)

输出结果为:

[11, 12, 22, 25, 34, 64, 90]
插入排序

插入排序是另一种常见的就地排序算法。它通过在已排序的子数组中插入新元素来排序。它的时间复杂度为O(n^2)。

以下是一个插入排序的Python示例:

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

arr = [12, 11, 13, 5, 6]
insertion_sort(arr)
print(arr)

输出结果为:

[5, 6, 11, 12, 13]
快速排序

快速排序是一种高效的就地排序算法,它的时间复杂度为O(nlogn)。它基于通过将数组分割为较小的部分来进行排序的原理。

以下是一个快速排序的Python示例:

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 quick_sort(arr,low,high):
    if low < high:
        pi = partition(arr,low,high)
        quick_sort(arr, low, pi-1)
        quick_sort(arr, pi+1, high)
    return arr

arr = [10, 7, 8, 9, 1, 5]
n = len(arr)
quick_sort(arr,0,n-1)
print(arr)

输出结果为:

[1, 5, 7, 8, 9, 10]
总结

就地排序算法是一种非常有用的排序算法,它可以让我们对集合进行原地排序而不创建新的集合。虽然就地排序算法可能有些复杂,但是在某些情况下,它们可以大大提高程序的性能。在使用就地排序算法时,请务必注意你的代码并进行严格的测试。