defquick_sort(arr):iflen(arr)<=1:return arrpivot = arr[len(arr)//2]# 选择数组的中间元素作为基准left =[x for x in arr if x < pivot]# 所有小于基准的元素middle =[x for x in arr if x == pivot]# 所有等于基准的元素right =[x for x in arr if x > pivot]# 所有大于基准的元素return quick_sort(left)+ middle + quick_sort(right)
6. 堆排序 (Heap Sort)
defheapify(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)# 递归堆化受影响的子树defheap_sort(arr):n =len(arr)# 构建最大堆for i inrange(n //2-1,-1,-1):heapify(arr, n, i)# 一个个提取元素for i inrange(n -1,0,-1):arr[i], arr[0]= arr[0], arr[i]# 交换heapify(arr, i,0)return arr
7. 希尔排序 (Shell Sort)
defshell_sort(arr):n =len(arr)gap = n //2while gap >0:for i inrange(gap, n):temp = arr[i]j = i# 插入排序while j >= gap and arr[j - gap]> temp:arr[j]= arr[j - gap]j -= gaparr[j]= tempgap //=2return arr
8. 计数排序 (Counting Sort)
defcounting_sort(arr):max_val =max(arr)m = max_val +1count =[0]* m# 统计每个元素的个数for a in arr:count[a]+=1i =0for a inrange(m):for c inrange(count[a]):arr[i]= ai +=1return arr
9. 基数排序 (Radix Sort)
defcounting_sort_for_radix(arr, exp):n =len(arr)output =[0]* ncount =[0]*10# 统计每个基数的个数for i inrange(n):index = arr[i]// expcount[index %10]+=1for i inrange(1,10):count[i]+= count[i -1]i = n -1while i >=0:index = arr[i]// expoutput[count[index %10]-1]= arr[i]count[index %10]-=1i -=1for i inrange(n):arr[i]= output[i]defradix_sort(arr):max_val =max(arr)exp =1while max_val // exp >0:counting_sort_for_radix(arr, exp)exp *=10return arr
10. 桶排序 (Bucket Sort)
defbucket_sort(arr):iflen(arr)==0:return arrbucket =[]slot_num =10# 桶的数量for i inrange(slot_num):bucket.append([])# 将元素分配到不同的桶中for j in arr:index =int(slot_num * j)bucket[index].append(j)# 对每个桶中的元素进行排序for i inrange(slot_num):bucket[i]= insertion_sort(bucket[i])k =0for i inrange(slot_num):for j inrange(len(bucket[i])):arr[k]= bucket[i][j]k +=1return arr
11. Tim Sort (Tim Sort)
MIN_MERGE =32defcalc_min_run(n):r =0while n >= MIN_MERGE:r |= n &1n >>=1return n + rdefinsertion_sort_for_timsort(arr, left, right):for i inrange(left +1, right +1):temp = arr[i]j = i -1while j >= left and arr[j]> temp:arr[j +1]= arr[j]j -=1arr[j +1]= tempdefmerge_for_timsort(arr, l, m, r):len1, len2 = m - l +1, r - mleft, right =[],[]for i inrange(0, len1):left.append(arr[l + i])for i inrange(0, len2):right.append(arr[m +1+ i])i, j,
用户打开 PDF 文档时,他们会看到 PDF 的初始视图。默认情况下,打开 PDF 时不会显示书签面板或缩略图面板。在本文中,我们将演示如何设置文档属性,以便每次启动文件时都会打开书签面板或缩略图面板。
Spire.PDF for .NET 是一款独…
随着信息技术的不断进步,文件传输和共享已经成为企业日常工作中不可或缺的一部分。传统的FTP(File Transfer Protocol)协议在一定程度上为文件共享提供了便利,但随着企业对文件传输的需求越来越复杂,FileLink内外网文件…