顺序查找
从列表第一个元素开始,顺序进行搜索,直到找到为止。 二分查找
从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。
li = [1, 2, 3, 4, 5, 6, 7, 8, 9]
val = 5
def search(li, val):
low = 0
high = len(li) - 1
while low <= high:
mid = (low + high) // 2
if val == li[mid]:
return mid
elif val < li[mid]:
high = mid + 1
else:
low = mid - 1
return 'no' print(search(li, val))
排序low B三人组:
冒泡排序
# 最好情况O(n) 平均情况O(n^2) 最坏情况O(n^2)
li = [1, 12, 4, 7, 88, 22, 4, 8, 23]

for i in range(len(li) - 1):
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:
break print(li)
选择排序
li = [1, 12, 4, 7, 88, 22, 4, 8, 23]

for i in range(0, len(li) - 1):
mini = i
for j in range(i, len(li)):
# 选择一个最小的记录
if li[j] < li[mini]:
mini = j
# 将当前位置于最小的交换
li[i], li[mini] = li[mini], li[i]
print(li)
插入排序
li = [1, 12, 4, 7, 88, 22, 4, 8, 23]
for i in range(1, len(li)):
tem = li[i]
j = i - 1
# 取一个数,插入到比他小的数的位置的后边,其他的数的下标向后移动
while j > 0 and li[j] > tem:
li[j + 1] = li[j]
j -= 1
li[j + 1] = tem
print(li)
排序NB三人组:
快速排序
import random

def quick_sort(li, left, right):
if left < right:
mid = partition(li, left, right)
# 左边排序
quick_sort(li, left, mid - 1)
# 右边排序
quick_sort(li, mid + 1, right) # 大小数据分开,返回下角标
def partition(li, left, right):
tem = li[left]
while left < right:
while li[right] >= tem and left < right:
right -= 1
li[left] = li[right]
while li[left] <= tem and left < right:
left += 1
li[right] = li[left]
li[left] = tem
return left # 减少递归深度[1000,999,....,0]
def random_partition(li, left, right):
i = random.randint(left, right)
li[i], li[left] = li[left], li[i]
return partition(li, left, right) if __name__ == '__main__':
li = [random.randint(0, 10000) for i in range(1000)]
print(li)
quick_sort(li, 0, len(li) - 1)
print(li)

更快的方法(空间复杂度-高)

def quick_sort2(li):
if len(li) < 2:
return li
tmp = li[0]
left = [v for v in li[1:] if v <= tmp]
right = [v for v in li[1:] if v > tmp]
left = quick_sort2(left)
right = quick_sort2(right)
return left + [tmp] + right
堆排序
归并排序
没什么人用的排序:
基数排序
希尔排序
桶排序

常用的-->查找算法与排序算法的更多相关文章

  1. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...

  2. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  3. [算法] 常见排序算法总结(C语言版)

    常见排序算法总结 本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序.插入排序.归并排序.希尔排序.快速排序等.算法性能比较如下图所示: 1 冒泡排序 基本原 ...

  4. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  5. c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法

    通用的(泛型)算法 之 只读算法,写算法,排序算法 只读算法: 函数名 功能描述 accumulate 求容器里元素的和 equal 比较2个容器里的元素 写算法 函数名 功能描述 fill 用给定值 ...

  6. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

  7. JS中算法之排序算法

    1.基本排序算法 1.1.冒泡排序 它是最慢的排序算法之一. 1.不断比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.当比较完第一轮的时候最后一个元素应该是最大的一个. 3.按照步骤一的方 ...

  8. 面试常用算法总结——排序算法(java版)

    排序算法 重要性不言而喻,很多算法问题往往选择一个好的排序算法往往问题可以迎刃而解 1.冒泡算法 冒泡排序(Bubble Sort)也是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个 ...

  9. STL_算法_02_排序算法

    ◆ 常用的排序算法: 1.1.合并(容器A(全部/部分)&容器B(全部/部分)==>容器C(全部/部分),容器C中元素已经排好顺序),返回的值==>iteratorOutBegin ...

  10. STL源代码分析——STL算法sort排序算法

    前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SG ...

随机推荐

  1. bzoj1097

    最短路+状压dp 肯定是状压dp 那么我们把k个点的单源最短路预处理出来,然后dp[i][j]表示状态为i,当前在j需要走的最短距离,给定的限制用状态压一下就行了 注意特判k=0的情况 #includ ...

  2. hdoj1495简单BFS

    #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> ...

  3. Hello world——程序员的第一篇代码

    Hello world 是和A+B问题并驾齐驱的一道题,也是当世的经典题之一. 题目: 输出“Hello world”    样例输入 样例输出    Hello world Hello world ...

  4. 基于 CODING 轻松搞定持续集成

    点击观看视频教程 带你一步一步搞定 CODING 持续集成 持续集成加速软件交付 持续集成这个概念是由 Grady Booch 在 1991 年首次提出,随后成为了 DevOps 的核心实践之一.持续 ...

  5. 强连通分量再探 By cellur925

    我真的好喜欢图论啊. (虽然可能理解的并不深hhh) 上一次(暑假)我们初探了强联通分量,这一次我们再探.(特别感谢pku-lyc老师的课件.有很多引用) 上次我们忘记讨论复杂度了.tarjan老爷爷 ...

  6. C#XmlDocument输出字符串

    XmlDocument xmlDoc = new XmlDocument(); //假定该xmlDoc已经有内容; MemoryStream streamXml = new MemoryStream( ...

  7. Centos7.2下安装redis&通用键值命令

    Centos7.2下安装redis&通用键值命令 Centos7.2下安装redis 官方网站:https://redis.io/ 1.进入/usr/local/src/目录 cd /usr/ ...

  8. 跟我一起玩Win32开发(6):创建右键菜单

    快捷菜单,说得容易理解一点,就是右键菜单,当我们在某个区域内单击鼠标右键,会弹出一些菜单项.这种类型的菜单,是随处可见的,我们在桌面上右击一下,也会弹出一个菜单. 右键菜单的好处就是方便,它经常和我们 ...

  9. [POI2005]Sza-Template

    Description Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段作为模版. 然后将模版重复喷涂到相应的位置后就得到了他想要的字符序列.一个字符可以被喷涂很 ...

  10. Hdu 5452 Minimum Cut (2015 ACM/ICPC Asia Regional Shenyang Online) dfs + LCA

    题目链接: Hdu 5452 Minimum Cut 题目描述: 有一棵生成树,有n个点,给出m-n+1条边,截断一条生成树上的边后,再截断至少多少条边才能使图不连通, 问截断总边数? 解题思路: 因 ...