from turtle import right
import numpy as np
length =10
nums = np.random.randint(100, size=length)
nums =list(nums)print(nums)defswap(arr, i, j):
arr[i], arr[j]= arr[j], arr[i]definsert_sort(arr, n):for i inrange(n):
j = i -1while j >=0and arr[j]> arr[j+1]:
swap(arr, j, j+1)
j = j -1defbin_insert_sort(arr, num):
left =0
right =len(arr)-1
middle = left +((right - left)>>1)while left < middle:if arr[middle]< num:
left = middle
elif arr[middle]> num:
right = middle
else:
left = middle
right = middle
middle = left +((right - left)>>1)
arr.insert(right, num)
insert_sort(nums,len(nums))print(nums)
bin_insert_sort(nums,10)print(nums)
选择排序
import numpy as np
length =10
nums = np.random.randint(100, size=length)
nums =list(nums)print(nums)defswap(arr, i, j):
arr[i], arr[j]= arr[j], arr[i]defselect_sort(arr, n):for i inrange(n):
mini_index = i
for j inrange(i+1, n):if arr[j]< arr[mini_index]:
mini_index = j
swap(arr, mini_index, i)
select_sort(nums,len(nums))print(nums)
冒泡排序
import numpy as np
length =10
nums = np.random.randint(100, size=length)
nums =list(nums)print(nums)defswap(arr, i, j):
arr[i], arr[j]= arr[j], arr[i]defbubbleSort(arr, n):for i inrange(n):
flag =0for j inrange(n-i-1):if arr[j]> arr[j+1]:
swap(arr, j, j+1)
flag +=1if flag ==0:break
bubbleSort(nums,len(nums))print(nums)
谢尔排序
import numpy as np
length =10
nums = np.random.randint(100, size=length)
nums =list(nums)print(nums)defswap(arr, i, j):
arr[i], arr[j]= arr[j], arr[i]defshell_sort(arr, n):
gap = n
while gap >1:
gap = gap >>1
flag =0for i inrange(n - gap):if arr[i]> arr[gap+i]:
swap(arr, i ,gap+i)
flag +=1if flag ==0:break
shell_sort(nums,len(nums))print(nums)
快速排序
import numpy as np
length =10
nums = np.random.random(length)
nums =list(nums)print(nums)defquickSort(arr, left=None, right=None):
left =0ifnotisinstance(left,(int,float))else left
right =len(arr)-1ifnotisinstance(right,(int,float))else right
if left < right:
partitionIndex = partition(arr, left, right)
quickSort(arr, left, partitionIndex -1)
quickSort(arr, partitionIndex+1, right)return arr
defpartition(arr, left, right):# pivot = left# index = pivot + 1# for i in range(index, right+1):# if arr[i] < arr[pivot]:# swap(arr, i, index)# index += 1# swap(arr, pivot, index - 1)# return index - 1
num = arr[np.random.randint(left, right+1)]# 随机快速排序 O(n*log(n))# num = arr[left] # 最坏情况下慢一些
i = left
while i <= right:if arr[i]> num:
swap(arr, i, right)
right -=1elif arr[i]< num:
swap(arr, i, left)
left +=1
i +=1else:
i +=1return i-1defswap(arr, i, j):
arr[i], arr[j]= arr[j], arr[i]print(quickSort(nums))
快速排序2
import numpy as np
length =10
nums = np.random.randint(100, size=length)
nums =list(nums)print(nums)defswap(arr, i, j):
arr[i], arr[j]= arr[j], arr[i]defquick(arr, oral_left, oral_right):if oral_left >= oral_right:return
num = arr[oral_left]
left = oral_left
right = oral_right
i = left
while i <= right:if arr[i]> num:
swap(arr, i, right)
right -=1elif arr[i]< num:
swap(arr, i, left)
left +=1
i +=1else:
i +=1print(arr, i)
quick(arr, oral_left, i-2)
quick(arr, i, oral_right)defquick_sort(arr, n):
quick(arr,0, n-1)
quick_sort(nums,len(nums))print(nums)
堆积排序
from math import log2
import numpy as np
length =10
nums = np.random.randint(100, size=length)
nums =list(nums)print(nums)defswap(arr, i, j):
arr[i], arr[j]= arr[j], arr[i]defheapDown(arr, index):
left_index =2*index +1while left_index <=len(arr):
large_index = left_index +1if(left_index+1)<len(arr)and arr[left_index]< arr[left_index+1]else left_index
if arr[large_index]> arr[index]:
swap(arr, large_index, index)
index = large_index
left_index =2*index +1else:breakdefheap_sort_insert(arr, num):
arr.append(num)
index =len(arr)-1while arr[int((index -1)/2)]< arr[index]:
swap(arr, index,int((index -1)/2))
index =int((index -1)/2)# first
res =[]for num in nums:
heap_sort_insert(res, num)print(res)# secondfor i inrange(len(nums)//2):
heapDown(nums,len(nums)//2-i-1)print(nums)
堆积排序2
from math import log2
import numpy as np
import math
length =10
nums = np.random.randint(100, size=length)
nums =list(nums)print(nums)"""
父节点 int((index-1)/2) 子节点 2*index+1 和 2*index+2
"""defheapInsert(arr, num):
arr.append(num)
temp_index =len(arr)-1while arr[temp_index]> arr[int((temp_index-1)/2)]:# temp_index > 0 可以省略
swap(arr, temp_index,int((temp_index-1)/2))
temp_index =int((temp_index-1)/2)defheapDown(arr, index):
left_index =2*index +1while left_index <=len(arr):
large_index = left_index +1if(left_index+1)<=len(arr)and arr[left_index]< arr[left_index+1]else left_index
if arr[large_index]> arr[index]:
swap(arr, large_index, index)
index = large_index
left_index =2*index +1else:breakdefswap(arr, i, j):
arr[i], arr[j]= arr[j], arr[i]defprint_nums(nums):
depth = math.log2(len(nums)+1)
i =1while i < depth:print(nums[pow(2,i-1)-1:pow(2, i)-1])
i +=1print(nums[pow(2,i-1)-1:])# heapInsert(nums, 100)
arr =[]for num in nums:
heapInsert(arr, num)
print_nums(arr)
print_nums(nums)
heapDown(nums,0)
print_nums(nums)
归并排序
import numpy as np
nums = np.random.random(5)
nums =list(nums)defmergeSort(nums_part):iflen(nums_part)==1:return nums_part
middle =len(nums_part)>>1return Sort(mergeSort(nums_part[:middle]), mergeSort(nums_part[middle:]))defSort(nums_part1, nums_part2):
res =[]whilelen(nums_part1)>0andlen(nums_part2)>0:if nums_part1[0]> nums_part2[0]:
res.append(nums_part1.pop(0))else:
res.append(nums_part2.pop(0))
res += nums_part1
res += nums_part2
return res
print(mergeSort(nums))
归并排序2
import numpy as np
length =10
nums = np.random.randint(100, size=length)
nums =list(nums)print(nums)defswap(arr, i, j):
arr[i], arr[j]= arr[j], arr[i]defmerge_arr(arr1, arr2):
i =0
j =0
res=[]while i <len(arr1)and j <len(arr2):if arr1[i]< arr2[j]:
res.append(arr1[i])
i +=1elif arr1[i]> arr2[j]:
res.append(arr2[j])
j +=1else:
res.append(arr1[i])
res.append(arr2[j])
i +=1
j +=1
res = res + arr1[i:]+ arr2[j:]return res
defmerge_sort(nums):iflen(nums)==1:return nums
middle =len(nums)>>1return merge_arr(merge_sort(nums[:middle]), merge_sort(nums[middle:]))print(merge_sort(nums))
计数排序
import numpy as np
length =10
nums = np.random.randint(5, size=length)
nums =list(nums)print(nums)defcount_sort(arr, max_num):
count_list = np.zeros(max_num)
res =[]for num in arr:
count_list[num]+=1for i inrange(len(count_list)):
res +=[i]*int(count_list[i])return res
print(count_sort(nums,5))
桶排序
import numpy as np
length =10
nums = np.random.randint(200, size=length)
nums =list(nums)print(nums)defnum_max_length(arr):
max_num = arr[0]for num in arr:if max_num < num:
max_num = num
res =0while max_num >0:
max_num = max_num //10
res +=1return res
defbucketsort(arr, max_length):for i inrange(max_length):help=[[]for _ inrange(10)]for num in arr:help[int((num/pow(10, i))%10)].append(num)
arr =[]for i inrange(len(help)):
arr +=help[i]return arr
print(bucketsort(nums, num_max_length(nums)))