defselectionSort(arr):for i inrange(len(arr)-1):# 记录最小数索引
minIndex = i
for j inrange(i +1,len(arr)):if arr[j]< arr[minIndex]:
minIndex = j
# i 不是最小数时,将i和最小数交换if i != minIndex:
arr[i], arr[minIndex]= arr[minIndex], arr[i]return arr
definsertionSort(arr):for i inrange(len(arr)):
preIndex = i -1
current = arr[i]while preIndex >=0and arr[preIndex]> current:
arr[preIndex +1]= arr[preIndex]
preIndex -=1
arr[preIndex +1]= current
return arr
defshellSort(arr):
gap =1while gap <len(arr)//3:
gap = gap *3+1while gap >0:for i inrange(gap,len(arr)):
temp = arr[i]
j = i - gap
while j >=0and arr[j]> temp:
arr[j + gap]= arr[j]
j -= gap
arr[j + gap]= temp
gap = gap //3return arr
defmergeSort(arr):iflen(arr)<2:return arr
middle =len(arr)//2# 注意:写法虽简单,但传递整个数组,在数组很大时,空间消耗
left, right = arr[:middle], arr[middle:]return merge(mergeSort(left), mergeSort(right))defmerge(left, right):
res =[]while left and right:if left[0]<= right[0]:
res.append(left.pop(0))else:
res.append(right.pop(0))while left:
res.append(left.pop(0))while right:
res.append(right.pop(0))return res
defMergeSort(lst):defmerge(arr, left, mid, right):
temp =[]
i = left
j = mid +1while i <= mid and j <= right:if arr[i]<= arr[j]:
temp.append(arr[j])
i +=1else:
temp.append((arr[j]))
j +=1while i <= mid:
temp.append(arr[i])
i +=1while j <= right:
temp.append(arr[j])
j +=1for i inrange(left, right +1):
arr[i]= temp[i - left]defmSort(arr, left, right):if left >= right:return
mid =(left + right)//2
mSort(arr, left, mid)
mSort(arr, mid +1, right)
merge(arr, left, mid, right)
n =len(lst)if n <=1:return lst
mSort(lst,0, n -1)return lst
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
i = index
while i <= right:if arr[i]< arr[pivot]:
swap(arr, i, index)
index +=1
i +=1
swap(arr, pivot, index -1)return index
defswap(arr, i, j):
arr[i], arr[j]= arr[j], arr[i]
defheapSort(arr):global arrLen
arrLen =len(arr)
buildMaxHeap(arr)for i inrange(len(arr)-1,0,-1):
swap(arr,0, i)
arrLen -= i
heapify(arr,0)return arr
defbuildMaxHeap(arr):for i inrange(len(arr)//2,-1,-1):
heapify(arr, i)defheapify(arr, i):
left =2* i +1
right =2* i +2
largest = i
if left < arrLen and arr[left]> arr[largest]:
largest = left
if right < arrLen and arr[right]> arr[largest]:
largest = right
if largest != i:
swap(arr, i, largest)
heapify(arr, largest)defswap(arr, i, j):
arr[i], arr[j]= arr[j], arr[i]
defbucket_sort(arr, n):'''
1.创建n个空桶
2.把arr[i] 插入到bucket[n*array[i]]
3.桶内排序
4.产生新的排序后的列表
'''
min_num, max_num =min(array),max(array)
bucket_num =(max_num - min_num)// n +1# 1.创建bucket_num 个空桶
new_list =[[]for _ inrange(bucket_num)]# 2.把arr[i] 插入到bucket[int(data - min_num) // n]for data in array:
index =int(data - min_num)// n
bucket_list[index].append(data)for i inrange(n):
bucket_list.sort()
index =0for i inrange(n):for j inrange(len(bucket_list[i])):
arr[index]= bucket_list[i][j]
index +=1return arr
defradix_sort(s):# 记录当前正在排哪一位,最低位为1
i =0
max_num =max(s)
j =len(str(max(s)))# 记录最大值的位数while i < j:
bucket_list =[[]for _ inrange(10)]for x in s:
bucket_list[int(x /(10** i))%10].append(x)# 找到位置放入桶数组
s.clear()for x in bucket_list:# 放回原数组for y in x:
s.append(y)
i +=1return s
'''1. bubbleSort2. selectionSort3. incertionSort4. shellSort5. mergeSort6. quickSort7. heapSort8. countingSort9. bucketSort10.radisSort'''def bubbleSort(arr): for i in range(1, len(arr)): for j in range(0, len(arr) - i):