冒泡、选择、插入、快速排序和二分查找python实现

1 排序

1.1 冒泡排序
def MaoPaoSort1(alist):
   
    alist = list(alist)
    length = len(alist)
    sorted_list = []   #开辟了新的内存空间
    
    if length == 1:
        sorted_list.append(alist[0])
    else:
        while length > 1: 
            for i in range(1,length):
                if alist[i] < alist[i - 1]:
                    alist[i],alist[i-1] = alist[i - 1],alist[i]
                    
            sorted_list.append(alist[-1])
            alist = alist[0:length - 1]
            length = len(alist)
            
    return sorted_list


def MaoPaoSort2(alist):
    alist = list(alist)
    
    for j in range(len(alist) - 1):
        for i in range(len(alist) - 1 - j):
            if alist[i] > alist[i + 1]:
                alist[i], alist[i + 1] = alist[i + 1], alist[i]
        
    return alist  
            
a = MaoPaoSort1([1,2,3,4,6,1,9,20,33,67,54])
a = MaoPaoSort2([1,2,3,4,6,1,9,20,33,67,54])

'''
output:
[1, 1, 2, 3, 4, 6, 9, 20, 33, 54, 67]
'''
1.2 选择排序
#选择排序:将乱序中的最大值找出,跟最后一个元素交换位置
def SelectedSort(alist):
    alist = list(alist)
    
    for j in range(len(alist) - 1):
    
        max_index = 0
        for i in range(1, len(alist) - j):
            if alist[i] > alist[max_index]:
                max_index = i
        
        alist[max_index],alist[len(alist) - 1 - j] = alist[len(alist) - 1 - j], alist[max_index]
        
    return alist  
    
a = SelectedSort([1,2,3,4,6,1,9,20,33,67,54])    


'''
output:
[1, 1, 2, 3, 4, 6, 9, 20, 33, 54, 67]
'''
1.3 插入排序
def InsertionSort(alist):
    
    for i in range(1, len(alist)):
        while i > 1:
            if alist[i-1] > alist[i]:
                alist[i - 1] ,alist[i] = alist[i], alist[i-1]
                i = i - 1
            else:
                break
    return alist

a = InsertionSort([1,2,3,4,6,1,9,20,33,67,54]) 

'''
output:
[1, 1, 2, 3, 4, 6, 9, 20, 33, 54, 67]
'''
1.4 快速排序
#给定一个基准值,<= 基准值的在左边,大于基准值的在右边
def QuickSort(alist):
    
    alist = list(alist)
    
    if len(alist) <= 1:
        return alist
    
    else:    
        middle = len(alist)//2    
        middle_value = alist[middle]
        
        alist_rest = alist[0:middle] + alist[middle + 1 :]
        
        left = [value for value in alist_rest if value <= middle_value]
        right = [value for value in alist_rest if value > middle_value]
    
        return QuickSort(left) + [middle_value] +  QuickSort(right) 

alist = [1,8,4,4,6,1,9,20,33,67,54,100,70,60,40,58]
a = QuickSort(alist)    
'''
output:
[1, 1, 2, 3, 4, 6, 9, 20, 33, 54, 67]
'''

2 二分查找

#二分查找,查找指定某一个数值在某个顺序数列中的位置
def HalfFind(alist,item):
    alist = list(alist)
    middle = len(alist)//2
    left = 0
    right = len(alist) - 1 
    
    while True:
        if item < alist[0] or item > alist[-1]:
            print(str(item),' no in the alist' )
            break
        if item == alist[middle]:
            return middle
            break
        elif item < alist[middle]:
            right = middle - 1
            middle = (left + right)//2
        else:
            left = middle + 1
            middle = (left + right)//2 
            
alist = [0,1,2,3,4,5,6,7,8,9,10]
print(HalfFind(alist,0))

'''
0
'''

二分查找适用于已经排好序的数组。

参考连接:

十大经典排序算法(动画显示)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值