2 算法查找&排序问题
一、查找
1、查找的概念:
2 顺序查找(linear search)
从头找到尾
def linear_search(li,val):
for ind ,v in enumerate(li):
if v==val:
return ind
else:
return None
3 二分查找(binary search):
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:
right = mid -1
else:
left = mid + 1
else:
return None
----------------
------------------------------
二、列表排序
1、什么是列表排序
排序:将一组“无序”的记录序列调整为“有序”的记录序列
列表排序:将无序列表变为有序列表
输入:列表
输出:有序列表
升序和降序
内置排序函数
2、常见排序算法介绍
排序的Low B三人组
时间复杂度都是O(n^2)
3、排序算法分析
冒泡排序(Bubble sort) 走n-1趟
第一次外层循环把最大的一个数移到最后;第二次外层循环把第二大的移到最后
每一次内部循环都从索引为0和1的数的比较
基本思想:对比相邻的元素值,如果满足提条件就交换元素值,把较小的元素移动到数组前面,把较大的元素移动到数组后面,这样较小的的元素就像气泡一样从底部上升到顶部
def bubble_sort(li):
for i in range(len(li)-1):# n-1趟
for j in range(len(li)-i-1): # 每一次内部循环需要比较的次数
#
if li[j]>li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
print(li,f'第{i+1}次外部循环 ,内部循环比较次数{len(li)-i-1}') li = [4,2,5,1,7,8,9,3,6]
bubble_sort(li)
-------------------------
def bubble_sort(li):
for i in range(len(li)-1):
for j in range(len(li)-i-1):
if li[j]>li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
# t=li[j]
# li[j]=li[j+1]
# li[j+1]=t
import random
# 列表生成式 L = [x * x for x in range(10)] 生成一个list,长度为1000,里面的元素是可以重复的随机数(范围0-10000)
li = [random.randint(0,10000) for i in range(1000)]
print(li)
bubble_sort(li)
print(li)
---------------------------
3.2 选择排序(select sort)
每一次循环选出最小的一个
基本思想:将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值,把满足条件的元素与指定的排序位置交换
def select_sort(li):
for i in range(len(li)-1):
min = i
for j in range(min+1,len(li)):
if li[min]>li[j]:
li[min],li[j] = li[j],li[min]
print(li, f'第{i+1}次外部循环 ,内部循环比较次数{len(li)-min-1}') li = [4,2,5,1,7,8,9,3,6]
select_sort(li)
print(li)
li = [3,2,4,1,5,6,8,7,9]
def select_sort_simple(li):
li_new = []
for i in range(len(li)):
min_val = min(li)
li_new.append(min_val)
li.remove(min_val)
return li_new print('select_sort_simple',select_sort_simple(li)) def select_sort(li):
for i in range(len(li)-1):
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]
print(li) select_sort(li)
-------------------------------
复杂度:0(n^2)
3.3 插入排序
基本思想:将一个记录插入到已排好序的有序表中,从而得到一个新的,记录数增1的有序表,然后再从剩下的关键字中选取下一个插入对象,反复执行直到整个序列有序。
def insert_sort(li):
for i in range(1,len(li)):
tem = li[i] # 要插入的数
j = i-1 # j指的是手里的牌的下标
while li[j] > tem and j>=0:
li[j+1] = li[j]
j -= 1
li[j+1] = tem
print(li)
li = [3,2,4,1,5,7,9,6,8]
insert_sort(li)
print(li,'最后结果')
插入排序的复杂度:O(n^2)
2 算法查找&排序问题的更多相关文章
- Kosaraju 算法查找强连通分支
有向图 G = (V, E) 的一个强连通分支(SCC:Strongly Connected Components)是一个最大的顶点集合 C,C 是 V 的子集,对于 C 中的每一对顶点 u 和 v, ...
- 回朔法/KMP算法-查找字符串
回朔法:在字符串查找的时候最容易想到的是暴力查找,也就是回朔法.其思路是将要寻找的串的每个字符取出,然后按顺序在源串中查找,如果找到则返回true,否则源串索引向后移动一位,再重复查找,直到找到返回t ...
- 数据结构与算法--KMP算法查找子字符串
数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...
- Java冒泡,快速,插入,选择排序^_^+二分算法查找
这段时间在学Java,期间学到了一些排序和查找方法.特此写来和大家交流,也方便自己的日后查看与复习. 1.下边是Java的主类: public class Get { public static vo ...
- c语言经典算法——查找一个整数数组中第二大数
题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...
- opencv2对读书笔记——使用均值漂移算法查找物体
一些小概念 1.反投影直方图的结果是一个概率映射,体现了已知图像内容出如今图像中特定位置的概率. 2.概率映射能够找到最初的位置,从最初的位置開始而且迭代移动,便能够找到精确的位置,这就是均值漂移算法 ...
- 基础算法-查找:线性索引查找(I)
前面介绍的几种查找的算法都是基于数据有序的基础上进行的.但是在实际的应用中,很多数据集可能有惊人的数据量,面对这些海量的数据,要保证记录全部按照当中的某个关键字有序,其时间代价是非常昂贵的,所以这种数 ...
- 算法——查找排序相关面试题和leetcode使用
1.给两个字符串s和t,判断t是否为s的重新排列后组成的单词. s = "anagram", t = "nagaram", return true. s = & ...
- 数据结构与算法---查找算法(Search Algorithm)
查找算法介绍 在java中,我们常用的查找有四种: 顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找 1)线性查找算法 示例: 有一个数列: {1,8, 10, 89, 1000, 123 ...
随机推荐
- vue-router总结
之前写过一篇关于vue-router的文章,主要是介绍怎么结合cli2在项目中使用vue-router,比较的简单,今天想结合cli3来总结一下vue-router的具体用法. cli3 在介绍vue ...
- 服务网关zuul之六:Zuul高可用
我们实际使用Zuul的方式如上图,不同的客户端使用不同的负载将请求分发到后端的Zuul,Zuul在通过Eureka调用后端服务,最后对外输出.因此为了保证Zuul的高可用性,前端可以同时启动多个Zuu ...
- Java-Runoob-高级教程-实例-方法:08. Java 实例 – break 关键字用法
ylbtech-Java-Runoob-高级教程-实例-方法:08. Java 实例 – break 关键字用法 1.返回顶部 1. Java 实例 - break 关键字用法 Java 实例 Ja ...
- Activity的启动模式--总结
3. Activity的任务栈Task以及启动模式与Intent的Flag详解? 2,Activity次级页面和主页间来回跳转,防止重复创建Activity实例 1, activity的启动模式: / ...
- Android 通过联系人姓名查询联系人号码
<!-- 读联系人权限 --><uses-permission android:name="android.permission.READ_CONTACTS" / ...
- orcale 函数wm_concat不存咋lob值使用zh_concat 替换
create or replace TYPE zh_concat_im AUTHID CURRENT_USER AS OBJECT ( CURR_STR VARCHAR2(32767), STATIC ...
- 第5章 IP地址和子网划分(3)_子网划分
6.子网划分 6.1 地址浪费 (1)IPv4公网地址资源日益紧张,为减少浪费,使IP地址能够充分利用,就要用到子网划分技术. (2)传统上一个C类地址,如212.2.3.0/24,其可用的地址范围为 ...
- 注册ActiveX控件
简单了解一下ActiveX控件的知识,ActiveX控件:简单来说,就是利用封装性的原理,把一些功能封装起来,我们可以再其他程序中使用,进而达到方便的目的.但是要注意ActiveX控件必须要注册后才可 ...
- ViewPager的addOnPageChangeListener和setOnPageChangeListener的区别,ViewPager改变数据后IndexOutOfBoundsException
我的ViewPager数据改变后,在切换界面刷新数据时:OnPageChangeListener中的数据IndexOutOfBoundsException,我们来看源码探一下究竟: 代码时这样写的: ...
- git创建远程项目并进行代码管理及相关命令
1.windows下载Git https://git-scm.com/downloads 然后一路点击安装 2.登录github,点击右上角创建仓库 3.在本地项目根目录下 输入如下命令 ss ...