📅  最后修改于: 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
以上是一些常见的就地算法,通过这些算法的实现和理解,我们可以更好地理解就地算法,并在实际编程中运用它们。