排序站点。。。。

#希尔排序
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)







 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值