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图如下图所示:
Python与Matlab算法学习一文通(快速排序算法)(更新中)_第1张图片
e.如下过程就是一次排序,将所有的小于基准数全部置于其左边,大于基准数置于右边,再分别对这两边的子序列进行相同的操作。直到最后需要操作的子序列中只有一个数,则排序结束。Python与Matlab算法学习一文通(快速排序算法)(更新中)_第2张图片

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] = key
    quicksort(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值右边为正确的,遍历下一个
        end
        data(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值左边为正确的,遍历下一个值
        end
        data(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 all

data=[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);					//打印快速排序后的序列

输出结果为:
Python与Matlab算法学习一文通(快速排序算法)(更新中)_第3张图片

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为66
    1.文字说明快速排序算法原理
    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,matlab,python,算法)