python数据结构与算法,查找,排序1

一、列表查找

1,顺序查找

从头到尾走一遍,返回所查找元素所在列表的下标

# 内置列表查找函数:index()
# 顺序查找 
# enumerate() 函数用于将一个可迭代对象(如列表、元组、字符串等)组合为一个索引序列,同时返回元素和它的索引
def linear_search(li, val):
    for ind, v in enumerate(li):
        if v == val:
            return ind
    else:
        return None
li_index = linear_search([1, 2, 2, 3],3)
print(li_index)

2,二分查找

也叫折半查找,从列表的初始候选区li[0,n]开始,通过对待查找的值与候选区中间值的比较,可使候选区减少一半。前提要求:有序列表

def binary_search(li, val):
    left = 0
    right = len(li) - 1
    while left <= right:    # 候选区有值
        mid = (left + right) // 2
        if li[mid] == val:
            return mid
        elif li[mid] > val:  # 带查找的值在mid左侧
            right = mid - 1
        else: # li[mid] < val 待查找的值在mid右侧
            left = mid + 1
    else:
        return None
print(binary_search([1, 2, 3, 4, 5, 6], 4))

二、列表排序

python内置排序函数sort

1,冒泡排序

列表中每相邻的的数,如果前面比后面大,则交换这两个数,一趟排序完成后,则无序区减少一个数,有序区增加一个数。

依次对无序区进行冒泡排序,每次有序区增加一个数,无序区减少一个数。

代码关键点:趟,无序区范围

                     第i趟无序区长度n-i-1

时间按复杂度:O(n的平方)

import random
#冒泡排序优化
def bubble_sort(li):
    for i in range(len(li)-1):  # 第i趟排序
        exchange = False
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]  # 交换列表中的两个数
                exchange = True # 判断排序是否发生变化,如果不变,则排序完毕
        if not exchange:
            return

li = [random.randint(0, 10000) for i in range(1000)]
print(li)
bubble_sort(li)
print(li)

2,选择排序

实现1:依次选择一个数插入新的列表(可以选择最小,也可以选择最大),空间复杂度高

实现2:查找最小的数,使其与第一个数交换位置,选记无序区第一个数是最小的为min_loc,往后依次比较,如果有更小的数,更新nim_loc,最后min_loc与第一个数做交换。

*一趟排序记录最小的数,放到有序区位置

*再一趟排序记录列表无序区最小的数,放到有序区位置

*......

算法关键点:有序区和无序区,无序区最小数的位置

时间复杂度:O(n的平方)

def select_sort(li):
    for i in range(len(li)): # 第几趟排序
        min_loc = i
        for j in range(i+1, len(li)):
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]
# 时间复杂度 n的平方

li = [2, 3, 5, 6, 7, 1, 0, 9, 8]
# print(select_sort_simple(li))
select_sort(li)
print(li)

3,插入排序

初始时有序区只有一个数,每次从无序区找一个数,插入到有序区已有牌的正确位置。

时间复杂度:O(n的平方)

def insert_sort(li):   # 从小往大排
    for i in range(1, len(li)): # i 表示摸到的牌(无序区按顺序摸)的下标
        tmp = li[i]
        j = i - 1  # j 表示手里牌的下标(相当于有序区的最后一张牌)
        while j >= 0 and li[j] > tmp:  # 相当于找插入的位置,在有序区找到比tmp小的数时停止循环
            li[j+1] = li[j]    # 由于在无序区摸了一张牌,空一个位置,如果有序区右边的数比tmp大,则往右挪一个位置
            j -= 1
        li[j+1] = tmp
# 时间复杂度 n的平方
li = [2, 3, 5, 6, 7, 1, 0, 9, 8]
insert_sort(li)
print(li)

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值