排序算法二:快速排序算法原理以及MATLAB与Python实现

今天继续学习排序算法。今天的主角是快速排序算法。

1. 快速排序基本原理

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

举例说明:

这里有一个待排序的序列:a=[72 6 57 88 60 42 83 73 48 85]

按照以上的思想,手动操作了一次这个思想:

这里写图片描述

上面的过程就是一次排序,将所有的小于选定的数全部放在了左边,全部大于选定的数放在了其右边。然后再分别对这两边的子序列进行相同的操作。知道最后需要操作的子序列中只有一个数。再排序结束。

2.MATLAB 实现

依据上面的思想对其进行代码实现。显然,对待子序列的操作最好就是使用过递归进行。

自定义快速排序函数 myQuickSort

function a=myQuickSort(a,leftIndex,rightIndex)
% a是待排序序列
%leftIndex和rightIndex是开始的左右两个边界
%%----------------------------------------------------------%%
% if leftIndex>rightIndex
%     break;
% end
if leftIndex<rightIndexi=leftIndex;j=rightIndex;temp=a(i);%选定的这个数挖掉,相当于挖坑while i<jwhile (i<j)&&(a(j)>=temp)%从右往左,找到第一个小于设定的数,j=j-1;enda(i)=a(j);%将找到的第一个小于设定的数填坑到最开始挖的坑里面去while (i<j)&&(a(i)<=temp)%从做到由,找到第一个大于选定的数i=i+1;enda(j)=a(i);%将找到的第一个大于选定的数填入上一步挖的坑里面去
%     if i==j
%         a(j)=temp;
%     endenda(j)=temp;%最后,i=j,将选定的数再填到上一步挖的坑里面去a=myQuickSort(a,leftIndex,j-1);%对左边序列进行递归a=myQuickSort(a,i+1,rightIndex);%对右边序列进行递归
end
end

测试函数

clc
clear
close alla=[72 6 57 88 60 42 83 73 48 85];
leftIndex=1;
rightIndex=size(a,2);disp('未排序的序列为:')
disp(a)a=myQuickSort(a,leftIndex,rightIndex);disp('快速排序之后的序列为:')
disp(a)

程序的输出为:

未排序的序列为:72     6    57    88    60    42    83    73    48    85快速排序之后的序列为:6    42    48    57    60    72    73    83    85    88

可以看出来,效果还不错。
再换一个有相同元素的序列试试:

    72     6    57    88    60    42    83    73    48    85     6快速排序之后的序列为:6     6    42    48    57    60    72    73    83    85    88

排序正确!!!

3.Python实现

#定义一个输出函数,将序列分成两部分的那个元素的索引
def findMiddleIndex(a,left,right):if left<right:i=leftj=righttemp=a[i]while i<j:while i<j and a[j]>=temp:j-=1a[i]=a[j]while i<j and a[i]<=temp:i+=1a[j]=a[i]a[j]=tempmiddleIndex=ireturn middleIndex
#定义快速排序函数
def myQuickSort(a,left,right):if left<right:middleIndex=findMiddleIndex(a,left,right)myQuickSort(a,left,middleIndex-1)myQuickSort(a,middleIndex+1,right)return a    
#测试部分
if __name__=='__main__':
#生成随机序列import randoma=[]aSize=a.__len__()while 1:aSize=a.__len__()if aSize>=20:breakelse:temp=int(random.randint(1,1000))a.append(temp)left=0right=a.__len__()-1print(myQuickSort(a,left,right))

这里写图片描述

排序正确!!!

4.快速排序算法的时间复杂度分析

已知递归算法的时间复杂度公式为:T(n)=aT[nb]+f(n)

最优时间复杂度是每次选定的数正好可以将序列分为一半,那么,就可以有:
第一次递归:

T(n)=2T[n2]+n

第二次递归: n=n2
T(n)=2{2T[n2×2]+n2}+n
=22T[n22]+2n

第三次递归: n=n2×2
T(n)=2{2{2T[n2×2×2]+n2×2}+n2}+n

=23T[n23]+3n

m次递归(假定此时递归结束):n=n2m1

T(n)=2mT[1]+mn

也就是说:
T[n2m]=T[1]
所以有:
2m=nm=log2n

所以,
T(n)=nT[1]+nlog2n=n+nlog2n

n>=2时,
log2n>=1nlog1n>=n

所以其时间复杂度最终为:
T(n)=nlog2n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序算法三:堆排序基本原理以及Python实现

1. 基本原理 堆排序就是利用堆的特性进行一个无序序列的排序工作。 堆的特点 堆分为最大堆和最小堆&#xff0c;其实就是完全二叉树。 最大堆要求节点的元素都要不小于其孩子最小堆要求节点元素都不大于其左右孩子。 两者对左右孩子的大小关系不做任何要求&#xff0c;其实…

spring jms 消息_Spring JMS,消息自动转换,JMS模板

spring jms 消息在我的一个项目中&#xff0c;我应该创建一个消息路由器&#xff0c;就像所有路由器一样&#xff0c;它应该从一个主题获取JMS消息并将其放入另一个主题。 该消息本身是JMS文本消息&#xff0c;实际上包含XML消息。 收到消息后&#xff0c;我还应该添加一些其他…

排序算法四:归并排序基本原理以及Python实现

1. 基本原理 归并排序建立在归并操作上的一种算法。该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。归并排序是将两 个已经有序的序列合成一个有序的序列的过程。 因此&#xff0c;对于一个待排序的序列来说&#xff0c;首先要将其进行…

如何将JAR添加到Jetbrains MPS项目

Jetbrains MPS是创建DSL的绝佳工具。 我们喜欢它&#xff0c;并在我们的咨询工作中定期使用它。 因此&#xff0c;我们之前已经写过关于Jetbrains MPS的文章 。 作为投影编辑器&#xff0c;您可以轻松创建可通过图形界面或数学公式之类使用的DSL。 尽管所有这些功能都需要做一…

Python 3实现k-邻近算法以及 iris 数据集分类应用

前言 这个周基本在琢磨这个算法以及自己利用Python3 实现自主编程实现该算法。持续时间比较长&#xff0c;主要是Pyhton可能还不是很熟练&#xff0c;走了很多路&#xff0c;基本是一边写一边学。不过&#xff0c;总算是基本搞出来了。不多说&#xff0c;进入正题。 1. K-邻近…

UART原理

UART原理 通用异步收发传输器&#xff08;Universal Asynchronous Receiver / Transmitter)&#xff0c;通常称作UART&#xff0c;是一种异步收发传输器&#xff0c;是电脑硬件的一部分。将资料由串行通信与并行通信间作传输转换&#xff0c;作为并行输入成为串行输出的芯片&am…

AttributeError: module 'tensorflow' has no attribute 'placeholder'等一系列tensorflow版本导致的问题

新人tensorflow2.1版本导致程序我无法运行最简单的办法 法1 tensorflow.compat.v1 import tensorflow.compat..v1 as tf tf.disable_v2_behavior() 亲测不好用 法2 卸载2.1&#xff0c;安装老版本 在Terminal界面输入 pip uninstall tensorflow接着输入Y确定卸载。 安装t…

word中一直提示校对错误,如何关闭当前文档校对功能

关闭当前文档校对功能 文件>选项>校对>例外项&#xff0c;选中两个&#xff0c;如图 对比效果&#xff1a;

将测微仪与Spring Boot 2一起使用

这是快速入门&#xff0c;介绍了如何使用出色的Micrometer库来检测基于Spring Boot 2的应用程序并在Prometheus中记录指标 介绍 Micrometer在各种监视工具提供的客户端库上提供了基于Java的外观。 以Prometheus为例&#xff0c;如果我要将Java应用程序与Prometheus集成&#…

与Maven的集成测试

用Maven实施单元测试是很普通的事情&#xff0c;我们大多数人都熟悉项目结构以及单元测试所在的位置。 但是&#xff0c;集成测试是一种不同的情况&#xff0c;大多数情况下它们具有完全不同的要求。 例如&#xff0c;可以让您的单元测试在内存数据库中的h2上运行&#xff0c;…

通信原理-通信系统的组成

第一章 通信系统的组成 1、通信系统一般模型 发送设备&#xff1a;将信源产生的原始电信号变换成适合在信道中传输的形式。变换方式有调制、放大、滤波、编码、多路复用等。 信道&#xff1a;传输信号的通道.即传输媒质。在给子信号通道的同时&#xff0c;信道也会对信号产生损…

使用log4j2免费分配日志记录

介绍 最近&#xff0c;我正在为一个客户端工作&#xff0c;试图为大型精心制作的Java系统消除一些GC暂停。 经过分析后&#xff0c;我意识到大部分垃圾都是通过日志记录产生的&#xff01; 是否有一种简单的方法来删除所有分配&#xff1f; 原来有:) 我应该使用哪个框架进行GC…

Verilog中fork...join 的用法

特点 中间的语句并行执行&#xff1b;&#xff08;延时不累加&#xff09; 不能用于综合&#xff1b; 代码 module signal_gen; reg wave; parameter cycle 5; initial beginforkwave 0;#(cycle) wave 1;#(2*cycle) wave 0;#(3*cycle) wave 1;#(4*cycle…

使用JWT的Cloud Native应用程序

本机云应用程序是为云计算环境开发的应用程序。 对于“ 什么是云原生应用程序 ”这个问题没有具体答案&#xff0c;但是必须满足不同的概念。 在我看来&#xff0c;最重要的功能之一就是能够快速缩放 。 这意味着我们的应用程序在每台服务器上都无法具有任何状态&#xff0c;…

开源项目GoodView点赞效果

点赞1效果&#xff1a; GoodView方法&#xff1a; 使用GoodView的Demo: public class MainActivity extends Activity { Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main)final Good…

开源RefreshListView下拉刷新效果

1、AnimationDrawable java.lang.Object ↳android.graphics.drawable.Drawable ↳android.graphics.drawable.DrawableContainer ↳android.graphics.drawable.AnimationDrawable 文档概述&#xff1a;An object used to create frame-by-frame animations, defined …

View的三大流程之View的测量

1、public class View extends Objectimplements Drawable.Callback KeyEvent.Callback AccessibilityEventSourcejava.lang.Object ↳android.view.View Class Overview This class represents the basic building block for user interface components. A View occupies a …

ListView的使用用ViewHolder提升效率

public class ListView extends AbsListViewjava.lang.Object ↳android.view.View ↳android.view.ViewGroup ↳android.widget.AdapterView<T extends android.widget.Adapter> ↳android.widget.AbsListView ↳android.widget.ListView Class Ove…

电脑还原Mac地址

之前修改过电脑Mac&#xff0c;现在与手机Mac冲突&#xff0c;导致手机无法连接校园网。 控制面板——》打开网络和共享中心——》选择更改适配器设置 本地连接——》右键选择属性 上图选择配置 高级——》在下拉菜单中选择网络地址——》右边选为“不存在” 之后本地连接会自…

聊天ListView使用ViewHolder

聊天界面会展示至少两种布局&#xff0c;即收到消息和发送消息。这样一个ListView与平时使用的ListView的最大不同&#xff0c;在于它有两个不同的布局&#xff1a;收到的布局和发送的布局。需要利用Adapter实现这样的效果。即需要在获取布局的时候判断该获取哪个布局。 public…