#希尔排序
def xier(list1):
mylen = len(list1)
bc = mylen // 2
while bc >= 1:
for i in range(bc,mylen):
while i >= bc and list1[i] < list1[i-bc]:
list1[i],list1[i-bc] = list1[i-bc],list1[i]
i -= bc
bc = bc // 2
print(list1)
li = [12,1,3,4,8,6,9,2,0,11]
xier(li)
#冒泡排序
def maopao(list2):
for i in range(len(list2)-1):
for j in range(len(list2)-1-i):
if list2[j]>list2[j+1]:
list2[j],list2[j+1] = list2[j+1],list2[j]
print(list2)
li= [1,3,4,8,6,9,2,0]
maopao(li)
# 插入排序
print('insertion_sort方法一')
def charu(list3,tag = True):
list4 = []
for i in list3:
for m,n in enumerate(list4):
if (i < n if tag else n < i):
list4.insert(m,i)
break
else:
list4.append(i)
print(list4)
li= [1,3,4,8,6,9,2,0]
charu(li,False)
print('insertion_sort方法二')
def insertion_sort(list1):
for j in range(1,len(list1)):#此处起始索引可 0 可 1 !
i = j - 1
key = list1[j]
while i >= 0 and list1[i] > key:
list1[i+1] = list1[i]
i -= 1
list1[i+1] = key
return list1
li = [3,9,4,0,8,1,5]
print(insertion_sort(li))
#counting_sort 计数排序
def counting_sort(list1):
list2 = []#用来统计个数
list3 = []#用于输出列表
for i in range(max(list1)+1):#使列表list2的长度是list1的元素的最大值
list2.append(0)
for t in range(len(list1)+1):#应该是list3的的长度等于list1的长度,但是这+1不然就报错
list3.append(t)
for m in list1:#统计m的个数
list2[m] += 1
for n in range(max(list1)+1):#统计小于等于list2[n]的元素的个数,说白了是为了确定list1元素的索引位置
if n == 0:
list2[n] = list2[n]
else:
list2[n] = list2[n] + list2[n-1]
for s in range(len(list1)-1,-1,-1):#输出列表,此处倒叙输出以确保计数排序的稳定性(相同元素在前面的先输出)
list3[list2[list1[s]]] = list1[s]
list2[list1[s]] -= 1
return list3[1:]#前面list3的长度比list1的多1个,所以这里这样操作的,暂时没有其他办法补救
li = [3,3,6,2,3,7,1,2,8,6,4,2,9]
print(counting_sort(li))
# 二分排序
def erfen(list6):
for i in range(1,len(list6)):
low = 0
high = i - 1
js = list6[i]
while low <= high:
mid = (low+high)//2
if js < list6[mid]:
high = mid - 1
else:
low = mid + 1
list6.pop(i)
list6.insert(low,js)#因为i被删所以只能写js而不写list6[i]
print(list6)
erfen(li)
#快速排序1
def kuaisu(list5,l,r):
if r > l:
q = bijiao(list5,l,r)
kuaisu(list5,l,q-1)
kuaisu(list5,q+1,r)
return list5
def bijiao(list5,l,r):
js = list5[r]
j = l
for i in range(l,r):
if list5[i] < js and i != j:
list5[i],list5[j] = list5[j],list5[i]
j += 1
list5[r],list5[j] = list5[j],list5[r]
return j #j 和 list5.index(js)一样
li = [1,3,4,8,7,6,9,2,0,5]
print(kuaisu(li,0,len(li)-1))
#快速排序2
def ks(list5,l,r):
if r > l:
js = list5[r]
j = l
for i in range(l, r):
if list5[i] < js:
list5[i], list5[j] = list5[j], list5[i]
j += 1
list5[j], list5[r] = list5[r], list5[j]#js只用来比较,如果此处用js那么list5[r]并没有参加排序
ks(list5,l,j-1)
ks(list5,j+1,r)
return list5
li = [12,1,13,8,16,2,6,11]
print(ks(li,0,len(li)-1))
#列表排序
def search(dic,id):
low = 0
high = len(dic)-1
while low <= high:
mid = (low + high) // 2
if dic[mid]['id'] == id:
print(mid)
for i,m in dic[mid].items():
print(i,m)
return#注意结束循环
elif dic[mid]['id'] > id:
high = mid - 1
else:
low = mid + 1
dic = [
{'id':1001, 'name':"张三", 'age':20},
{'id':1002, 'name':"李四", 'age':25},
{'id':1004, 'name':"王五", 'age':23},
{'id':1007, 'name':"赵六", 'age':33}
]
search(dic,1002)
#选择排序
def select_sort(list):
for i in range(len(list)-1):
min_num = i
for m in range(i+1,len(list)):
if list[m] < list[i]:
min_num = m
if min_num != i:
list[i],list[min_num] = list[min_num],list[i]
return list
li = [3,5,1,6,2,8,4]
print(select_sort(li))
print('--------------------------------------------------------------')
#快速排序他人的
def ks(L,low,high):
i = low
j = high
if i >= j:
return L
key = L[i]
while i < j:
while i < j and L[j] >= key:
j = j-1
L[i] = L[j]
while i < j and L[i] <= key:
i = i+1
L[j] = L[i]
L[i] = key
ks(L, low, i-1)
ks(L, j+1, high)
return L
a=[51,49,6,9,21,7,13,32,85]
ks(a,0,len(a)-1)
print(a)
#二分排序他人的
def binary(arr):
for i in range(1,len(arr)):
low=0
high=i-1
key=arr[i]
while low<=high:
mid=(low+high)//2
if key<arr[mid]:
high=mid-1
else:
low=mid+1
for j in range(i-1,low-2,-1):
arr[j+1]=arr[j]
arr[low]=key
print(arr)
arr=[1,7,2,5,9,3]
binary(arr)