python3 实现经典的排序与搜索算法

1).插入算法,最优时间复杂度:O(n), 最坏时间复杂度:O(n^2).
   算法原理:从无序数列中选一个元素插入到有序的子序列中去,得到一个有序的、元素加一的子序列,直到整个无序数列的元素为0,则整个序列全部有序。

2).选择排序:在无序数列中找到最小元素,存放在数列的起始位置,然后从剩余未排序元素中继续寻找最小元素,放到已排序序列的末尾。以此类推,直到所有元素排序完毕。

3).快速排序算法:最优时间复杂度:O(nlogn), 最坏时间复杂度:O(N^2)

4).冒泡排序:重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。

5).希尔排序:希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序属于插入类排序,是将整个有序序列分割成若干小的子序列分别进行插入排序。
   排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止。

6).二分查找算法:二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
   查找过程:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
   python3算法实现:

### 排序/搜索算法 ###

##  插入排序算法实现  ##
def insert_sort(eg_list):
    # 从第2个元素开始向前插入 #
    for i in range(1, len(eg_list)):
        # 从第i个元素开始向前比较,小于前一个元素,交换位置 #
        for j in range(i, 0, -1):
            if eg_list[j] < eg_list[j-1]:
                eg_list[j], eg_list[j-1] = eg_list[j-1], eg_list[j]


##  选择排序算法  ##
def select_sort(eg_list):
    for j in range(len(eg_list)-1):
        min_index = j
        for i in range(j+1, len(eg_list)):
            if eg_list[min_index] > eg_list[i]:
                min_index = i
        eg_list[j], eg_list[min_index] = eg_list[min_index], eg_list[j]


## 递归排序算法 ##
def merge_sort(eg_list):
    if len(eg_list)  <= 1:
        return eg_list
    mid = len(eg_list)//2
    left = merge_sort(eg_list[:mid])
    right = merge_sort(eg_list[mid:])
    result = []
    l, r = 0, 0
    while l < len(left) and r < len(right):
        if left[l] < right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    result += left[l:]
    result += right[r:]
    return result


##  冒泡排序算法  ##
def bubble_sort(data):
    for i in range(len(data) - 1, 0, -1):
        for j in range(0, i):
            if data[j] > data[j + 1]:
                data[j], data[j + 1] = data[j + 1], data[j]


##  快速排序算法  ##
def quick_sort(data, low = 0, high = None):
    if high == None:
        high = len(data) - 1
    if low < high:
        s, i, j = data[low], low, high
        while i < j:
            while i < j and data[j] >= s:
                j = j - 1
            if i < j:
                data[i] = data[j]
                i = i + 1
            while i < j and data[i] <= s:
                i = i + 1
            if i < j:
                data[j] = data[i]
                j = j - 1
        data[i] = s
        quick_sort(data, low, i - 1)
        quick_sort(data, i + 1, high)


##  二分查找算法  ##
def binary_search(eg_list, item):
    n = len(eg_list)
    if n > 0:
        mid = n//2
        if eg_list[mid] == item:
            return True
        elif item < eg_list[mid]:
            return binary_search(eg_list[:mid], item)
        else:
            return binary_search(eg_list[mid+1:], item)
    return False




eg_list = [2, 4, 6, 8, 9, 23, 51, 77, 88, 99]
print(binary_search(eg_list, 10))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值