目录

二分法

冒泡排序

快速排序


二分法

二分法是一种在有序数组中查找某一特定元素的搜索算法.

  • 搜索过程从数组的中间元素开始:
  • 如果中间元素正好是要查找的元素,则搜索过程结束;
  • 如果某一特定元素大于或者小于中间元素, 则在数组大于或小于中间元素那一半中查找, 而且跟开始运营从中间元素开始比较;
  • 如果在某一步骤数组为空,则代表找不到.

代码实现:


l1 = [11, 23, 32, 45, 65, 78, 90, 123, 432, 467, 567, 687, 765, 876, 999, 1131, 1232]def get_num(l1, target_num):# 添加递归函数的结束条件if len(l1) == 0:print('不好意思 找不到')return# 1.先获取数据集中间那个数middle_index = len(l1) // 2middle_value = l1[middle_index]# 2.判断中间的数据值与目标数据值孰大孰小if target_num > middle_value:# 3.说明要查找的数在数据集右半边  如何截取右半边right_l1 = l1[middle_index + 1:]# 3.1.获取右半边中间那个数# 3.2.与目标数据值对比# 3.3.根据大小切割数据集# 经过分析得知 应该使用递归函数print(right_l1)get_num(right_l1, target_num)elif target_num < middle_value:# 4.说明要查找的数在数据集左半边  如何截取左半边left_l1 = l1[:middle_index]# 4.1.获取左半边中间那个数# 4.2.与目标数据值对比# 4.3.根据大小切割数据集# 经过分析得知 应该使用递归函数print(left_l1)get_num(left_l1, target_num)else:print('找到了', target_num)
get_num(l1, 999)
[467, 567, 687, 765, 876, 999, 1131, 1232]
[999, 1131, 1232]
[999]
找到了 999

冒泡排序

介绍

冒泡排序,又称起泡排序。他是一种基于交换的排序典型,也是快排思想的基础。对于冒泡排序名字的由来,百度百科这么说:

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

冒泡排序的基本思想为:从前往后把大元素往后调.

分析

具体思想为(把大元素往后调):

  • 从第一个元素开始往后跑,每到一个位置判断是否比后面的元素大,如果比后面元素大,那么就交换两者大小,然后继续向后,否则就直接向后前进,这样的话进行一轮之后就可以保证最大的那个数一直被交换交换到最末的位置可以确定。
  • 那么第二次同样从开始起向后判断着前进,如果当前位置比后面一个位置更大的那么就和他后面的那个数交换。但是有点注意的是,这次并不需要判断到最后,只需要判断到倒数第二个位置就行(因为第一次我们已经确定最大的在倒数第一,这次的目的是确定倒数第二)
  • 同理,后面的操作也是如此,直到第一个元素使得整个元素有序。

拿个例子来说,比如2,8,9,3,7,6,12,4这个序列的冒泡排序来说。会有多趟(7)排序,每一趟要执行多(8-k)次。 对于它的第一趟排序来说是这样的:

多次排序后结果为:

代码

在具体实现的时候,要分清是从小到大还是从大到小,还有次数也要注意,谨防越界! 至于冒泡排序的关键代码为:

def bubbleSort(arr):n = len(arr)# 遍历所有数组元素for i in range(n):# Last i elements are already in placefor j in range(0, n-i-1):if arr[j] > arr[j+1] :arr[j], arr[j+1] = arr[j+1], arr[j]arr = [64, 34, 25, 12, 22, 11, 90]bubbleSort(arr)print ("排序后的数组:")
for i in range(len(arr)):print ("%d" %arr[i]),

快速排序

介绍

快速排序是对冒泡排序的一种改进,采用递归分治的方法进行求解。而快排相比冒泡是一种不稳定排序,时间复杂度最坏是O(n^2^),平均时间复杂度为O(nlogn),最好情况的时间复杂度为O(nlogn)。

分析

对于快排来说,基本思想是这样的

快排需要将序列变成两个部分,就是序列左边全部小于一个数序列右面全部大于一个数,然后利用递归的思想再将左序列当成一个完整的序列再进行排序,同样把序列的右侧也当成一个完整的序列进行排序。

其中这个数在这个序列中是可以随机取的,可以取最左边,可以取最右边,当然也可以取随机数。但是通常我们取最左边的那个数。当然,为了实现这个目标,实现方式可能不一样,但是我这里采取的是大众常规的方式和方法。!

这里的一个难题就是如何处理将比第一个数K小的全部放左面,把比K大的全部放右面!如果没有什么技巧,直接硬性往里面塞,你肯定要一个额外存储空间先把整个先存了。然后遍历比较然后放入目标区域。当然这样太浪费空间内存了。我们为了节省计算机资源,采取这样的方法:

  1. 先用一个空间标记这个最左侧的数K。然后从右往左high--先找到一个比这个K小的数a[high],把这个a[high]放到a[low]位置(因为这个a[low]的初始K已经被额外空间记录过,不用担心)。
  2. 这样右侧不符合要求小于K的已经调到最左侧了,我们再从左侧向右low++一直到a[low]>K.也就是找到第一个比K大的数,它在左侧不符合要求所以我们把它移动到右侧,而我们刚刚所说的a[high]已经被赋值移到左侧,所以我们把这个a[low]大于K的数值移动到右端a[high]处,这样又保证high右侧全部大于K,low左侧全部小于K。
  3. 就又开始重复第一步啦一直到low&gt;high为止(即所有左侧都小于K,右侧都大于K)。

代码

在书写代码的时候,要注意一些顺序,防止数组越界情况,可以写好debug一遍其实就很好理解了!当写代码遇到错误时候,不要急着就去找正确答案,能有时间自己发现错误,可以借助断点查看程序执行流程,这样对自己的收益是最大的! 至于快排的代码,是这样的:

def quick_sort(data):    """快速排序"""    if len(data) >= 2:  # 递归入口及出口        mid = data[len(data)//2]  # 选取基准值,也可以选取第一个或最后一个元素        left, right = [], []  # 定义基准值左右两侧的列表        data.remove(mid)  # 从原始数组中移除基准值        for num in data:            if num >= mid:                right.append(num)            else:                left.append(num)        return quick_sort(left) + [mid] + quick_sort(right)    else:        return data# 示例:
array = [2,3,5,7,1,4,6,15,5,2,7,9,10,15,9,17,12]
print(quick_sort(array))
# 输出为[1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 9, 9, 10, 12, 15, 15, 17]排序后的数组:
11
12
22
25
34
64
90

算法介绍--- 二分法,冒泡排序,快排相关推荐

  1. (十)更快的排序算法(归并、快排、基数)

    目标 1) 使用下列方法将一个数组按升序排序:归并排序.快速排序和基数排序 2) 评估排序的效率,讨论不同的方法的相对效率 目录 9.1 归并排序 9.1.1 归并数组 9.1.2 递归归并排序 9. ...

  2. 排序算法:冒泡和快排 摘自网络

    冒泡排序: 首先我们自己来设计一下"冒泡排序",这种排序很现实的例子就是: 我抓一把沙仍进水里,那么沙子会立马沉入水底, 沙子上的灰尘会因为惯性暂时沉入水底,但是又会立马像气泡一样 ...

  3. 三路快排算法加强版(三路快排的再次改进)

    :不要忘记初心哈 :) 理论依据 快排算法的缺陷及其逐一改进 三路快排尽可能三等份划分区间 通过待排元素的区间长度划分? 通过待排元素的最值之差划分? 直接使用待排元素的最大值划分? 实验数据 大范围 ...

  4. 惊雷算法下如何使用快排快速上首页?

    SEO的小朋友们,应该都正面临这样的问题,站内文章词穷,站外链接受到各种限制.这个时候,很多站长都面临着一个尴尬的局面,排名禁锢在前五页,始终无法再往上提升.一个网站想要好的排名永远离不开三种东西:页 ...

  5. 基于visual Studio2013解决算法导论之011快排改良

     题目 快排改良 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...

  6. 【数据结构的魅力】003.算法归并与随机快排

    归并排序的实现 1)递归方法实现 2)非递归方法实现 快速排序 Partition过程 实现思路: 给定一个num,划定一个<=区,初始坐标为-1 如果[i]==num,i++ 如果[i]< ...

  7. 八大排序算法之快速排序(下篇)(快排的优化+非递归快排的实现)

    目录 一.前言 1.快速排序的实现: 快速排序的单趟排序(排升序)(快慢指针法实现):​ 2.未经优化的快排的缺陷 二.快速排序的优化 1.三数取中优化 优化思路: 2. 小区间插入排序优化 小区间插 ...

  8. 在php中冒泡排序,php中实现快排与冒泡排序

    快排 function quicksort($str){ if(count($str)<=1) return $str;//如果个数不大于一,直接返回 $key=$str[0];//取一个值,稍 ...

  9. BFPRT算法:时间复杂度O(n)求第k小的数字(分治算法+快排)

    我自己搭建了博客,以后可能不太在CSDN上发博文了,https://www.qingdujun.com/ . 去年写了一篇<分治算法 求第kkk小元素 O(n)O(n)O(n) & O( ...

最新文章

  1. 【数论基础】欧几里德算法及其各种应用
  2. SpringBoot | 第十五章:基于Postman的RESTful接口测试
  3. JVM学习笔记二:JVM参数
  4. Asp.Net Core 中IdentityServer4 实战之角色授权详解
  5. ☆【UVA - 624 】CD(dp + 0-1背包 + 记录路径)
  6. centos挂载windows共享目录
  7. Linux系统编程8-18总结项目:完成一个简单的自己的shell
  8. 房地产企业营销分析系统建设中的关键性指标是什么?
  9. python虚拟环境 windows环境搭建_windows下安装Python虚拟环境virtualenvwrapper-win
  10. curl以cookie的方式登录
  11. 华为云IoT体验:基于IoT平台构建智慧路灯应用
  12. java builder_带继承的Java Builder模式
  13. ChineseLunisolarCalendar 农历日期
  14. 强化理解指针、指针数组和数组指针(从三味书屋到成华大道)
  15. 武汉_金山wps Java 一面 二面
  16. 浅析GPU通信技术(上)-GPUDirect P2P
  17. 记一次抗DDOS演练
  18. 像素时代的黄昏和“淘宝叛军”
  19. 算法的时间复杂度取决于:
  20. 多层循环给数组添加元素重复添加问题

热门文章

  1. windows系统下php-ffmpeg类库的使用
  2. “好嗨哟” 收获手机淘宝高可用这些干货 感觉开发走向了巅峰
  3. 【甄选靶场】Vulnhub百个项目渗透——项目八:IMF-1(文件上传,缓冲区溢出)
  4. SCP 提示 Permission denied, please try again.解决方法
  5. 【LKH算法体验】Python调用LKH算法求TSP问题
  6. Win10录屏快捷键无反应怎么办?
  7. cad线加粗怎么设置_CAD怎么改变线条粗细 CAD改变线条粗细 方法介绍
  8. 半导体分立器件测试系统NSAT-2000
  9. iphone13和华为mate40对比,哪个值得买?
  10. 新仙魔九界研发及设计分析