什麼是Sorting Algorithms?
Sorting Algorithms的時間複雜度計算方式是什麼?
哪些Sorting Algorithms可以實現穩定排序?
Sorting Algorithms在什麼情況下可能會導致排序失敗?
什麼是「in-place sorting」?那些Sorting Algorithms可以實現in-place sorting?
排序算法是計算機科學中處理數據的常用算法之一,它可以將一組數據按照順序排列。常用的排序算法包括冒泡排序、插入排序、選擇排序、快速排序、合併排序、堆排序等。
下面舉例來說明不同的排序算法:
例如,對於以下數列進行冒泡排序:[5, 2, 8, 6, 3, 9, 1]
第一輪排序:[2, 5, 6, 3, 8, 1, 9]
第二輪排序:[2, 5, 3, 6, 1, 8, 9]
第三輪排序:[2, 3, 5, 1, 6, 8, 9]
第四輪排序:[2, 3, 1, 5, 6, 8, 9]
第五輪排序:[2, 1, 3, 5, 6, 8, 9]
第六輪排序:[1, 2, 3, 5, 6, 8, 9]
例如,對於以下數列進行插入排序:[5, 2, 8, 6, 3, 9, 1]
第一輪排序:[2, 5, 8, 6, 3, 9, 1]
第二輪排序:[2, 5, 8, 6, 3, 9, 1]
第三輪排序:[2, 5, 6, 8, 3, 9, 1]
第四輪排序:[2, 3, 5, 6, 8, 9, 1]
第五輪排序:[1, 2, 3, 5, 6, 8, 9]
例如,對於以下數列進行選擇排序:[5, 2, 8, 6, 3, 9, 1]
第一輪排序:[1, 2, 8, 6, 3, 9, 5]
第二輪排序:[1, 2, 3, 6, 8, 9, 5]
第三輪排序:[1, 2, 3, 5, 8, 9, 6]
第四輪排序:[1, 2, 3, 5, 6, 9, 8]
第五輪排序:[1, 2, 3, 5, 6, 8, 9]
例如,對於以下數列進行快速排序:[5, 2, 8, 6, 3, 9, 1]
第一輪排序:[1, 2, 3, 5, 8, 9, 6]
第二輪排序:[1, 2, 3, 5, 6, 8, 9]
例如,對於以下數列進行合併排序:[5, 2, 8, 6, 3, 9, 1]
第一輪排序:[2, 5, 8, 6, 1, 3, 9]
第二輪排序:[1, 2, 3, 5, 6, 8, 9]
以上就是Sorting Algorithms的重點,各算法在時間複雜度和空間複雜度等方面都有不同優點和限制,需要根據應用場景選擇適合的算法來進行排序。
def quickSortInPlace(arr, low, high):
if low < high:
pivot = partition(arr, low, high)
quickSortInPlace(arr, low, pivot - 1)
quickSortInPlace(arr, pivot + 1, high)
def partition(arr, low, high):
pivot_value = arr[high]
i = low - 1
for j in range(low, high):
if arr[j] <= pivot_value:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[high] = arr[high], arr[i + 1]
return i + 1
如何使用MergeSort來對超過1TB的大型數據進行排序?
答案:將數據分成小的塊,分別使用MergeSort進行排序,然後依次合併這些已排序的塊,直到所有數據都被排序。這種方法稱為外部排序(external sorting)。例如,可以將數據分成100GB的塊,排序每個塊,然後使用儲存器並行合併這些已排序的塊。
如何實現HeapSort算法?
答案:HeapSort使用最大堆(Max Heap)來實現排序的過程。首先將數據構建成最大堆,然後依次取出堆頂元素(最大元素),放到數列最後,再進行最大堆重建操作。請參考以下代碼:
def heapSort(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)
def heapify(arr, n, i):
largest = i
l = 2*i + 1
r = 2*i + 2
if l < n and arr[l] > arr[largest]:
largest = l
if r < n and arr[r] > arr[largest]:
largest = r
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
import random
def quickSelect(arr, left, right, k):
if left == right:
return arr[left]
pivotIndex = random.randint(left, right)
pivotIndex = partition(arr, left, right, pivotIndex)
if k == pivotIndex:
return arr[k]
elif k < pivotIndex:
return quickSelect(arr, left, pivotIndex - 1, k)
else:
return quickSelect(arr, pivotIndex + 1, right, k)
def partition(arr, left, right, pivotIndex):
pivotValue = arr[pivotIndex]
arr[pivotIndex], arr[right] = arr[right], arr[pivotIndex]
storeIndex = left
for i in range(left, right):
if arr[i] < pivotValue:
arr[i], arr[storeIndex] = arr[storeIndex], arr[i]
storeIndex += 1
arr[storeIndex], arr[right] = arr[right], arr[storeIndex]
return storeIndex
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def bubbleSortList(head):
if not head:
return None
flag = True
while flag:
flag = False
curr = head
while curr.next:
if curr.val > curr.next.val:
curr.val, curr.next.val = curr.next.val, curr.val
flag = True
curr = curr.next
return head
以上所有代碼均為Python 3.6+。