Python与Matlab算法学习一文通(快速排序算法)(更新中)
想利用一些空余时间学一学python与matlab,与同学建立不知道能坚持多久的学习联盟,每周一部分题目,利用一周时间完成原理文档与程序编写。由于主要研究方向为其他方向,因此只会利用很少的空闲时间来学习,进度可能会较慢。
有想一起学习的小伙伴评论区留言呀~
文章目录
- 前言
- 一、儒雅随和锅包肉:2021.10.18~10.24(入门算法主题)
- 题目:快速排序算法(Python与Matlab实现)
- 1.1快速排序算法的主要原理
- 1.2Python代码实现
- 1.3Matlab代码实现
- 1.4递归介绍
- 二、儒雅随和锅包肉:2021.10.25~10.31(Python基础语法内容)
- 题目:Python变量类型、数据结构、数据结构、判断语句四部分内容总结
- 三、儒雅随和锅包肉:2021.11.01~11.07(入门算法主题)
- 题目:二分查找算法
- 题目:最长不重复子串
- 题目:三数之和
前言
冲冲冲!
一、儒雅随和锅包肉:2021.10.18~10.24(入门算法主题)
整体要求:需考虑算法的效率,能够适应大容量数据运算;每个题目需对原理进行分析。
实现语言:python与matlab
题目:快速排序算法(Python与Matlab实现)
数据:[1,1,3,3,2,2,6,6,6,5,5,7]
要求:利用快速排序算法进行列表数据排序1.文字说明快速排序算法原理2.代码需有充足注释
解答:
1.1快速排序算法的主要原理
a. 在数组中选一个基准数(通常为数组第一个);
b. 将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边;
c. 对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序;
d. 具体原理gif图如下图所示:
e.如下过程就是一次排序,将所有的小于基准数全部置于其左边,大于基准数置于右边,再分别对这两边的子序列进行相同的操作。直到最后需要操作的子序列中只有一个数,则排序结束。
1.2Python代码实现
def quicksort(data,start,end): #定义函数,参数分别为数据(list),算法起始位以及结束位,往往分别为0与len(data)-1,即第一个数据与最后一个数据if start >= end: #当起始位置在结束位置之前时return #退出递归key = data[start] #以列表第一个数据作为标志位i = start #将起始位置作为i。从i位置开始向右遍历j = end #将结束位置作为j。从j位置开始向左遍历#将所有比key值大的置于key值右边,所有比key值小的置于左边;while i != j : #当i与j未重合时,即分别在key值的左右两半时while i < j and data[j] >= key: #当i值小于j值,且此时j位置大于key值时j = j - 1 #则此j位置值置于key值右边为正确的,遍历下一个data[i] = data[j] #当找到data[j]比key值小时,退出上述while循环,将找到的比key值小的j位置值赋值给i位置while i < j and data[i] < key: #同样道理,当i值小于j值,且此时j位置小于key值时i = i + 1 #则此i位置值置于key值左边为正确的,遍历下一个值data[j] = data[i] #当找到data[i]比key值大时,退出上述while循环,将找到的比key值大的i位置值赋值给j位置#上述遍历后,i与j重合,重合位置即为key值正确位置,比其小的都在左边,比其大的元素都在右边data[i] = keyquicksort(data,start,i-1) #同样的办法,遍历key值左半部分的quicksort(data,i+1,end) #遍历key值右半部分data =[1,1,3,3,2,2,6,6,6,5,5,7] #等待排序的数据
quicksort(data,0,len(data)-1) #执行快速排序算法
print(data) #打印排序后的data数据
上述算法执行结果为:
1.3Matlab代码实现
函数代码文件QuickSort.m如下:
function data =QuickSort(data,start,endadd) //定义函数名,与函数返回值
if start >= endadd //退出递归的条件return
end
if start < endadd //当递归条件符合时key = data(start); //第一个数据作为键值i = start; //将起始位置作为i。从i位置开始向右遍历j = endadd; //将结束位置作为j。从j位置开始向左遍历while i ~= j //当i与j未重合时,即分别在key值的左右两半时while (i<j) && (data(j) >= key) //当i值小于j值,且此时j位置大于key值时j = j-1; //则此j位置值置于key值右边为正确的,遍历下一个enddata(i) = data(j); //当找到data[j]比key值小时,退出上述while循环,将找到的比key值小的j位置值赋值给i位置while (i<j) && (data(i) <= key) //同样道理,当i值小于j值,且此时j位置小于key值时i = i+1; //则此i位置值置于key值左边为正确的,遍历下一个值enddata(j) = data(i); //当找到data[i]比key值大时,退出上述while循环,将找到的比key值大的i位置值赋值给j位置end//上述遍历后,i与j重合,重合位置即为key值正确位置,比其小的都在左边,比其大的元素都在右边data(i) = key;data =QuickSort(data,start,j-1);//同样的办法,遍历key值左半部分的data =QuickSort(data,i+1,endadd);//遍历key值右半部分
end
测试文件代码如下:
clc
clear
close alldata=[1,1,3,3,2,2,6,6,6,5,5,7]; //数据内容
start=1; //起始位置,在matlab中,数组元素位置从1开始
endadd=size(data,2); //disp('未排序的序列为:'); //打印文字
disp(data); //打印未排序的序列data=QuickSort(data,start,endadd); //将数据进行快速排序disp('快速排序之后的序列为:');//打印文字
disp(data); //打印快速排序后的序列
输出结果为:
1.4递归介绍
本代码利用到递归,所谓递归通俗来讲就是在函数定义的内部不断去调用自己;
以下为一个简单的递归实例:
# 将 10不断除以2,直至商为0,输出这个过程中每次得到的商的值。
def recursion(n):v = n//2 # 保留整数print(v) # 每次求商,输出商的值if v==0:return 'Done'#当商为0时,停止递归:在函数中,return后,则不会继续执行下面的语句,则停止了递归v = recursion(v) # 递归调用,函数内自己调用自己
recursion(10)
上述算法执行结果为:
即函数通过不断调用自身,直到满足退出递归的要求为止。
二、儒雅随和锅包肉:2021.10.25~10.31(Python基础语法内容)
整体要求:通过充分查阅资料,整理Python基础语法内容。
实现语言:python
题目:Python变量类型、数据结构、数据结构、判断语句四部分内容总结
1.变量类型
2.数据结构
3.数据结构
4.判断语句
2021.10.31之后
三、儒雅随和锅包肉:2021.11.01~11.07(入门算法主题)
整体要求:需考虑算法的效率,能够适应大容量数据运算;每个题目需对原理进行分析。
实现语言:python与matlab
题目:二分查找算法
数据:[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11,11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26,26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40,42, 43, 45, 45, 46, 46, 47, 47, 51, 52, 52, 53, 53,55, 55, 56, 56, 57, 57, 57, 58, 59, 61, 62, 64, 66,66, 67, 68, 69, 69, 71, 72, 72, 74, 74, 75, 76, 78,78, 79, 79, 79, 79, 80, 82, 85, 88, 89, 90, 90, 91,91, 91, 94, 99, 99]
要求:给定一个有序数组 arr 和一个目标元素 target ,返回该 target 在 arr 中的索引,若不存在,返回-1。本题arr如上所示,target为661.文字说明快速排序算法原理2.代码需有充足注释
题目:最长不重复子串
数据:1.“abcbefgf” 2.“abcdef” 3."abbcddefh"
要求:给定一个字符串,找出没有重复字符的最长的子串。例如输入“abcbefgf”,答案是 “cbefg”。1.文字说明快速排序算法原理(动态规划+哈希查找)2.代码需有充足注释
题目:三数之和
数据:arr = [-3,-1,-2,1,2,3]
要求:给定一个数组和目标数target,找出数组中a,b,c满足 a+b+c = target 的所有组合。例如:arr = [-3,-1,-2,1,2,3],target = 0。输出为 [(-3,1,2),(-2,-1,3)]1.代码需有充足注释2.时间复杂度要求为O(n**2) ,空间复杂度要求O(1)
Python与Matlab算法学习一文通(快速排序算法)(更新中)相关推荐
- 算法学习(二)快速排序(下)
快速排序采取的是分治法,所以怎么把一个无序的数组以某个点为中界来将其拆分成有序的两部分,这是其快 排的核心方法. 在上一章中,是一开始提出来的"快速排序",但是这个世界上在某些地方 ...
- 算法学习(二)快速排序(上)
快速排序采用的思想是分而治之. 1)将一整个大的无序序数组,根据数组中的某一个值,将数组分成两部分,一部分比这个值小,一部分比这个值大. 2)然后再对这两部分各自进行同样的操作,而当每一部分都有序之后 ...
- C++学习笔记目录链接(持续更新中)
学习目标: C++学习笔记目录链接(持续更新中,未完待续) 学习内容: 序号 链接 0 C++ 常见bug记录(持续记录中) 1 C++学习笔记1[数据类型] 2 C++学习笔记2[表达式与语句] 3 ...
- 图解算法学习笔记(一): 算法简介
本章内容: 编写第一种查找算法--二分查找. 学习如何谈论算法的运行时间--大O表示法. 1) 算法是一组完成任务的指令,任何代码片段都可视为算法. 2)二分查找:一种查找算法,其输入是一个有序的元素 ...
- [源码、文档、分享] iOS/iPhone学习系列、代码教程----~~~持续更新中~~~
转自:http://www.devdiv.com/iOS_iPhone-iOS_iPhone%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%97%E3%80%81%E4%BB%A3 ...
- 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)
数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...
- 「五大常用算法」一文图解分治算法和思想
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 前言 分 ...
- 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》
文章目录 0.前言 1.功能 2.示例 有两个名单tinyW.txt和tinyT.txt,将tinyT.txt名单中不在tinyW.txt的数据打印出来 ① 实现原理 ② 实现代码 ③ 性能分析 0. ...
- mysql区间算法_「五大常用算法」一文图解分治算法和思想
前言 分治算法(divide and conquer)是五大常用算法(分治算法.动态规划算法.贪心算法.回溯法.分治界限法)之一,很多人在平时学习中可能只是知道分治算法,但是可能并没有系统的学习分治算 ...
最新文章
- RS232串口交叉直连
- MyBatis-09MyBatis注解方式之@Update/@Delete
- vmware 扩展Ubuntu虚拟机的磁盘空间
- 冒泡排序(数组)的一种实现
- Self-Orthogonality Module:一个即插即用的核正交化模块
- vue 保存时清空iuput_Vue 一键清空表单的实现方法
- Shell编程之运算
- python 老师和父亲_父亲节丨有个当老师的爸爸是怎样的体验
- windows xp输入法设置空白解决的方法
- js基础--操作css内联样式及获取css样式
- HTML制作qq空间主页
- 几十个精选壁纸网站,配色网站,字体网站
- UVA - 12235 Help Bubu 概率dp 状态压缩 记忆化搜索
- 淘宝母婴商品分析-Python
- 【OpenCV】纹理提取
- java,NIO非阻塞式网络通信DEMO.
- adb删除系统应用命令
- 树上三角形(idea+lct或splay)
- zend stutio安装
- 安全狗入选CSA《2021中国零信任全景图》多个领域