冒泡、选择、插入、快速排序和二分查找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
    评论
好的,我来为您介绍这几种排序算法。 1. 冒泡排序:它是一种简单的排序算法,通过不断交换相邻的元素来将序列排序。具体来说,它每次比较相邻的两个元素,如果顺序不对就交换它们的位置。重复这个过程直到所有元素都排好序为止。时间复杂度为 O(n^2)。 2. 直接插入排序:它是一种稳定的排序算法,它每次将一个待排序的元素插入到已经排好序的序列中。具体来说,它从第二个元素开始,将其插入到已经排好序的前面的序列中。时间复杂度为 O(n^2)。 3. 折半插入排序:它是一种改进的直接插入排序算法,它通过二分查找的方式来寻找插入位置,从而减少了比较次数。具体来说,它将待排序的元素插入到已经排好序的序列中,但是它是通过二分查找来寻找插入位置的。时间复杂度为 O(n^2)。 4. 简单选择排序:它是一种简单的排序算法,它每次选择一个最小的元素,并将其放到已经排好序的序列的末尾。具体来说,它从第一个元素开始,找到最小的元素并将其放到第一个位置,然后从剩余的元素中找到最小的元素并将其放到第二个位置,以此类推。时间复杂度为 O(n^2)。 5. 快速排序:它是一种高效的排序算法,它通过分治的方式来将序列分成两个子序列,然后对这两个子序列分别进行排序。具体来说,它选择一个基准元素,将序列分成两个子序列,左边的子序列都比基准元素小,右边的子序列都比基准元素大。然后递归地对左右子序列进行快速排序。时间复杂度为 O(nlogn)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值