5

Sort Algorithm | 一直进步 做喜欢的

 1 year ago
source link: https://xfliu1998.github.io/2023/06/13/Sort-Algorithm/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一直进步 做喜欢的

Sort Algorithm

Created2023-06-13|Updated2023-06-13|Data Structures and Algorithms
Word count:993|Reading time:4min|Post View:1|Comments:

排序算法是一种将一组元素按照特定规则进行排列的算法。tips:

  • 稳定指如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
  • 二维数组.sort(key=lambda x: x[0]) 根据指定二维数组的第一个元素升序排序
  • 二维数组.sort(key=lambda x: (x[0], -x[1]))根据指定二维数组的第一个元素升序排序,若第一个元素相等,按第二个元素降序排序
  • sort()排序的时间复杂度为O(NlogN),使用的是归并排序。
排序算法
算法 思想 复杂度 稳定性
冒泡排序(Bubble Sort) 重复比较相邻的两个元素,如果顺序不正确则交换,直到整个序列排序完成 O(n^2) 稳定
插入排序(Insertion Sort) 将待排序的元素逐个插入已排序的序列中的适当位置,直到整个序列排序完成 O(n^2) 稳定
选择排序(Selection Sort) 在未排序的序列中选择最小(或最大)的元素,将其放置在已排序序列的末尾,重复这个过程直到整个序列排序完成 O(n^2) 不稳定
快速排序(Quick Sort) 选择一个基准元素,将序列分为两个子序列,左边的子序列都小于基准元素,右边的子序列都大于基准元素,然后对两个子序列进行递归排序 O(nlogn) 不稳定
归并排序(Merge Sort) 将序列递归分为两个子序列,对每个子序列进行排序,然后合并两个有序子序列以得到排序后的序列 O(nlogn) 稳定
堆排序(Heap Sort) 将待排序序列构建为一个最大(或最小)堆,然后逐个从堆中取出最大(或最小)元素,重建堆,直到整个序列排序完成 O(nlogn) 稳定
希尔排序(Shell Sort) 将待排序序列按照一定的增量进行分组,对每个分组使用插入排序,然后逐步缩小增量直至为1,最后进行一次完整的插入排序 O(nlogn) 稳定
# 冒泡排序
def bubble_sort(arr):
n = len(arr)
for i in range(n - 1):
for j in range(n - 1 - i):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr

# 插入排序
def insertion_sort(arr):
n = len(arr)
for i in range(1, n):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
return arr

# 选择排序
def selection_sort(arr):
n = len(arr)
for i in range(n - 1):
min_index = i
for j in range(i + 1, n):
if arr[j] < arr[min_index]:
min_index = j
arr[i], arr[min_index] = arr[min_index], arr[i]
return arr

# 快速排序
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
left = [x for x in arr[1:] if x <= pivot]
right = [x for x in arr[1:] if x > pivot]
return quick_sort(left) + [pivot] + quick_sort(right)


# 归并排序
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)

def merge(left, right):
merged = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
merged.append(left[i])
i += 1
else:
merged.append(right[j])
j += 1
while i < len(left):
merged.append(left[i])
i += 1
while j < len(right):
merged.append(right[j])
j += 1
return merged


# 堆排序
def heapify(arr, n, i):
largest = i
left = 2 * i + 1
right = 2 * i + 2

if left < n and arr[left] > arr[largest]:
largest = left

if right < n and arr[right] > arr[largest]:
largest = right

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 shell_sort(arr):
n = len(arr)
gap = n // 2

while gap > 0:
for i in range(gap, n):
temp = arr[i]
j = i
while j >= gap and arr[j - gap] > temp:
arr[j] = arr[j - gap]
j -= gap
arr[j] = temp
gap //= 2

return arr

十大经典排序算法(动图演示)

排序算法
题目 技巧 难度
🌟
🌟
🌟

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK