Python 排序和堆的操作

自己自学了点排序和堆的操作,现学现卖,有不好的地方欢迎各路大神指点!
1.二分法

def twojudge(search_list,target):
    left=0
    right=len(search_list)-1
    while left<=right:
        mid=(left+right)//2
        if search_list[mid]<target:
            left=mid+1
            continue
        if search_list[mid]==target:
            return mid
        if search_list[mid]>target:
            right=mid-1
    return None
search_list=[1,3,4,6,8,9]
print(twojudge(search_list,5))
print(twojudge(search_list,1))
print(twojudge(search_list,3))
print(twojudge(search_list,8))

2.插入排序

def insert_sort(origin_list):#原始列表
    sorted_list=[]#重新排序后的列表
    for i in range(0,len(origin_list)):
        if len(sorted_list)==0:
            sorted_list.append(origin_list[i])
            continue
        for j in range(len(sorted_list)-1,-1,-1):
            if sorted_list[j]<=origin_list[i]:
               sorted_list.insert(j+1,origin_list[i])
               break
            if j==0:
                sorted_list.insert(0,origin_list[i])
    origin_list[:]=sorted_list[:]
origin_list=[5,3,1,7,9,8]
insert_sort(origin_list)
print(origin_list)

3.冒泡排序

def bbb_sort(origin_list):
    for i in range(len(origin_list),0,-1):
        for j in range(0,i-1):
            if origin_list[j]>origin_list[j+1]:
                origin_list[j],origin_list[j+1]=origin_list[j+1],origin_list[j]

origin_list=[5,3,1,7,9,8]
bbb_sort(origin_list)
print(origin_list)

4.快速排序

def quick_sort(origin_list,start,end):
    if start>=end:
        return
    left=start
    right=end
    flag_index=left
    while left<right:
        while right>left:
            if origin_list[right]<origin_list[flag_index]:
                origin_list[right],origin_list[flag_index]=origin_list[flag_index],origin_list[right]
                flag_index=right
                break
            right-=1
        while left<right:
            if origin_list[left]>origin_list[flag_index]:
                origin_list[left],origin_list[flag_index]=origin_list[flag_index],origin_list[left]
                flag_index=left
                break
            left+=1
        quick_sort(origin_list,start,flag_index)
        quick_sort(origin_list,flag_index+1,end)
origin_list=[5,3,1,3,7,9,8]
quick_sort(origin_list,0,len(origin_list)-1)
print(origin_list)

5.归并排序

def merge_sort(origin_list,start,end):
    if end<=start:
        return
    mid=(start+end)//2
    merge_sort(origin_list,start,mid)
    merge_sort(origin_list,mid+1,end)
    left_head=start
    right_head=mid+1
    temp_list=[]
    while left_head<=mid and right_head<=end:
        if origin_list[left_head]<origin_list[right_head]:
            temp_list.append(origin_list[left_head])
            left_head+=1
        if origin_list[left_head]>=origin_list[right_head]:
            temp_list.append(origin_list[right_head])
            right_head+=1
    if left_head<=mid:
        temp_list+=origin_list[left_head:mid+1]
    if right_head<=end:
        temp_list+=origin_list[right_head:end+1]
    for i in range(0,len(temp_list)):
        origin_list[i+start]=temp_list[i]

origin_list=[5,3,1,3,7,9,8]
merge_sort(origin_list,0,len(origin_list)-1)
print(origin_list)

6.堆的操作

class Heap(object):
    def __init__(self):
        self.data_list=[1]

    def size(self):
        return len(self.data_list)-1

    def left_child(self,root):
        return root*2

    def right_child(self,root):
        return root*2+1

    def father(self,node):
        return node//2

    def heapify(self,root):#维护堆
        if root>self.size():#如果当前节点的下标大于列表的大小
            return
        left_node=self.left_child(root)
        right_node=self.right_child(root)
        largest=root
        if left_node<=self.size():
            if self.data_list[left_node]>self.data_list[largest]:
                largest=left_node
        if right_node<=self.size():
            if self.data_list[right_node]>self.data_list[largest]:
                largest=right_node
        if largest!=root:
            self.data_list[root],self.data_list[largest]=self.data_list[largest],self.data_list[root]
            self.heapify(largest)

    def build_heap(self):#建堆
        for i in range(self.size()//2,0,-1):
            self.heapify(i)

    def get_max(self):#取堆顶
        if self.size()==0:
            return None
        ret=self.data_list[1]
        self.data_list[1]=self.data_list[-1]
        del self.data_list[-1]
        self.heapify(1)
        return ret

    def insert(self,data):#新增数据
        self.data_list.append(data)
        now_index=self.size()
        pre=self.father(now_index)
        while self.data_list[pre]<data and now_index!=1:
            self.data_list[pre],self.data_list[now_index]=self.data_list[now_index],self.data_list[pre]
            now_index=pre
            pre=now_index//2
heap=Heap()
heap.insert(9)
heap.insert(10)
heap.insert(7)
heap.insert(12)
heap.insert(3)
heap.insert(4)
print(heap.get_max())
print(heap.get_max())
print(heap.get_max())
print(heap.get_max())
print(heap.get_max())
print(heap.get_max())
print(heap.get_max())
heap.insert(10)
heap.insert(9)
heap.insert(8)
heap.insert(7)
heap.insert(7)
heap.insert(12)
print(heap.get_max())
heap.data_list=[None,1,2,3,4,5,6,7,8,9]
heap.build_heap()
print(heap.get_max())
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值