算法数据结构03 /二分查找、排序算法

1. 二分查找

  • 二分查找:只能作用在有序集合

  • 代码实现:

    def middle(alist,item):
        find = False
        low = 0
        high = len(alist)-1
    
        while not find and low <= high:  # 要加=号
            mid = (low+high)//2 # 中间元素下标
            # 查找的值大于中间元素的值,意味着查找的值只可能出现在中间值的右侧
            if item > alist[mid]:
                low = mid + 1
            # 查找的值和中间元素相等,意味着找到了
            elif item == alist[mid]:
                find = True
            # 查找的值小于中间元素的值,意味着查找的值只可能出现在中间值的左侧
            else:
                high = mid - 1
        return find
    alist = [1,2,3,4,5,6,7]
    print(middle(alist,8))

2. 排序算法

  • 冒泡排序

    1.实现将最大的数移到最右边

    def sort(alist):
        for i in range(0,len(alist)-1):  # 循环n-1次,n就是列表元素的个数
            if alist[i] > alist[i+1]:
                alist[i],alist[i+1] = alist[i+1],alist[i]
        print(alist)
    alist = [3,8,6,7,5]
    sort(alist)
    
    # 结果:[3, 6, 7, 5, 8]

    2.实现冒泡排序:将上述操作逐步作用(n-1)次

    def sort(alist):
        for j in range(0,len(alist)-1):
            for i in range(0,len(alist)-1-j):  # 循环n-1次,n就是列表元素的个数
                if alist[i] > alist[i+1]:
                    alist[i],alist[i+1] = alist[i+1],alist[i]
        return alist
    alist = [3,8,6,7,5]
    print(sort(alist))
    
    # 结果:[3, 5, 6, 7, 8]
  • 选择排序

    1.直接找出列表中的最大值,移到列表最后位置

    def sort(alist):
        max_index = 0  # 最大值的下标,一开始假设第0个元素是最大值
        for i in range(0,len(alist)-1):  # 为了找出最大值的下标
            if alist[max_index] < alist[i+1]:
                max_index = i + 1
        alist[max_index],alist[len(alist)-1] = alist[len(alist)-1],alist[max_index]
        return alist

    2.实现选择排序:将上述操作再逐步的作用

    def sort(alist):
        for j in range(0,len(alist)-1):
            max_index = 0  # 最大值的下标,一开始假设第0个元素是最大值
            for i in range(0,len(alist)-1-j):  # 为了找出最大值的下标
                if alist[max_index] < alist[i+1]:
                    max_index = i + 1
            alist[max_index],alist[len(alist)-1-j] = alist[len(alist)-1-j],alist[max_index]
        return alist
    alist = [3,8,6,7,5]
    print(sort(alist))
    
    # 结果:[3, 5, 6, 7, 8]
  • 插入排序

    1.有序序列元素只有一个

    # 变量i表示列表下标,还表示有序序列中元素的个数
    # 有序序列只有一个元素,无序序列有n-1个元素
    i = 1
    # alist[i] 表示的是无需序列的第一个元素
    # alist[i-1]  表示的是有序序列的最后一个元素
    if alist[i] < alist[i-1]:
        alist[i],alist[i-1] = alist[i-1],alist[i]

    2.有序序列元素有两个

    i = 2  # 表示有序序列有两个元素
    # alist[i] 表示的是无需序列的第一个元素
    # alist[i-1]  表示的是有序序列的最后一个元素
    while i>1:
        if alist[i] < alist[i-1]:
            alist[i],alist[i-1] = alist[i-1],alist[i]
            i -= 1
        else:
            break

    3.实现插入排序:完整代码,自动处理i (len-1)

    def sort(alist):
        for i in range(1,len(alist)):
            while i >= 1:
                if alist[i] < alist[i-1]:
                    alist[i],alist[i-1] = alist[i-1],alist[i]
                    i -= 1
                else:
                    break
        return alist
    alist = [49,38,65,97,76,13,27]
    print(sort(alist))
    
    # 结果:[13, 27, 38, 49, 65, 76, 97]
  • 希尔排序

    1.实现步骤简述

    1.先增量初始值进行分组
    2.每组进行一次插入排序
    3.再缩小增量
    4.再进行每组的插入排序
    5.直到增量为1
    6.最后进行插入排序

    2.将插入排序的增量1变成gap

    def sort(alist):
        gap = len(alist)//2
        # 将下属所有的1换成gap
        for i in range(gap,len(alist)):
            while i >= gap:
                if alist[i] < alist[i-gap]:
                    alist[i],alist[i-gap] = alist[i-gap],alist[i]
                    i -= gap
                else:
                    break
        return alist

    3.实现希尔排序:缩减增量

    def sort(alist):
        gap = len(alist)//2
        while gap >= 1:
            # 将下属所有的1换成gap
            for i in range(gap,len(alist)):
                while i >= gap:
                    if alist[i] < alist[i-gap]:
                        alist[i],alist[i-gap] = alist[i-gap],alist[i]
                        i -= gap
                    else:
                        break
            gap //= 2 # 缩减增量
        return alist
    alist = [49,38,65,97,76,13,27]
    print(sort(alist))
    
    # 结果:[13, 27, 38, 49, 65, 76, 97]
  • 快速排序

    1.实现快速排序

    def sort(alist,start,end):
        low = start
        high = end
        if low > high:   # 结束递归的条件
            return
    
        mid = alist[low]  # 基数
        while low < high:
            while low < high:
                if alist[high] > mid:
                    high -= 1  # high向左偏移
                else:
                    alist[low] = alist[high]
                    break
            while low < high:
                if alist[low] < mid:
                    low += 1
                else:
                    alist[high] = alist[low]
                    break
        if low == high:
            alist[low] = mid
        sort(alist,start,high-1)  # 处理基数左部分的乱序序列
        sort(alist,low+1,end)  # 处理基数右部分的乱序序列
        return alist
    alist = [49,38,65,97,76,13,27]
    print(sort(alist,0,len(alist)-1))
    
    # 结果:[13, 27, 38, 49, 65, 76, 97]
12-24 01:24
查看更多