📜  就地算法(1)

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

就地算法

就地算法,也称为原位算法,是一种在不使用额外空间的情况下在数据结构上进行操作的算法。换句话说,它们使用原有的数据结构进行操作,而不分配或使用其他空间。

为何使用就地算法

使用就地算法的优点在于:

  • 提高了运行时间和内存的效率,因为不必分配或使用其他空间。
  • 减少了代码的复杂性和维护成本,因为不需要管理或跟踪其他空间的内存分配或释放。
  • 减少了与其他代码库或环境之间的冲突,因为不必与其他代码库之间的分配或使用空间的问题发生矛盾。

常见的就地算法

以下是常见的就地算法:

反转数组

反转数组是一种常见的就地算法。其基本思路是通过操作原数组中的元素,来使其元素实现反转。

def reverse_array(arr):
    left = 0
    right = len(arr) - 1
    while left < right:
        arr[left], arr[right] = arr[right], arr[left]
        left += 1
        right -= 1
    return arr
堆排序

堆排序是一种常见的原位排序算法。其基本思路是通过在数组的子集中进行重建数组,来对整个数组进行排序。

def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2

    if l < n and arr[i] < arr[l]:
        largest = l

    if r < n and arr[largest] < arr[r]:
        largest = r

    if largest != i:
        arr[i], arr[largest] = arr[largest],arr[i]
        heapify(arr, n, largest)

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

快速排序是一种常见的原位排序算法。其基本思路是通过拆分原数组并在其子集上进行操作,来对整个数组进行排序。

def partition(arr, low, high):
    i = low - 1
    pivot = arr[high]

    for j in range(low, high):

        if arr[j] < pivot:
            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
单链表的反转

单链表的反转是一种常见的就地操作,其基本思路是通过调整链表元素之间的链接关系,来实现链表的反转。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def reverse(self):
        prev = None
        current = self.head
        while(current is not None):
            next = current.next
            current.next = prev
            prev = current
            current = next
        self.head = prev

    def printList(self):
        temp = self.head
        while(temp):
            print(temp.data)
            temp = temp.next

以上是一些常见的就地算法,通过这些算法的实现和理解,我们可以更好地理解就地算法,并在实际编程中运用它们。