算法分析之排序:交换排序之二——快速排序(QuickSort)

news/2024/5/19 23:58:29 标签: java, 快速排序, 算法, 排序算法

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

设要排序的 数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的 排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序算法是:
1)设置两个 变量i、j, 排序开始的时候:i=0,j=N-1;
2)以第一个 数组元素作为关键数据,赋值给 key,即 key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 key的值A[j],将A[j]赋给A[i];
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于 key的A[i],将A[i]赋给A[j];
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于 key,4中A[j]不大于 key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

你可以想象一下i和j是两个机器人,数据就是大小不一的石头,先取走i前面的石头留出回旋的空间,然后他们轮流分别挑选比k大和比k小的石头扔给对面,最后在他们中间把取走的那块石头放回去,于是比这块石头大的全扔给了j那一边,小的全扔给了i那一边。

快速排序的时间复杂度分析:

最好情况下时间复杂度是O(nlogn);

最坏情况下时间复杂度是O(n^2);

java">public class QuickSort{
	public static void sort(int[] a,int start,int end){
		int i,j;
		i=start;
		j=end;
		if(a=null||a.length==0) return;

		while(i<j){
			while(i<j&&a[j]>a[i]){j--;}
			if(i<j){
				int temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
			while(i<j&&a[i]<a[j]){i++;}
			if(i<j){
				int temp=a[j];
				a[j]=a[i];
				a[i]=temp;
			}
			if(i-start>1) {
				sort(a,start,i-1);
			}
			if(end-i>1) {
				sort(a,i+1,end);
			}
		}
		
	}

}



http://www.niftyadmin.cn/n/1543800.html

相关文章

Windows 环境下Docker 安装伪分布式 Hadoop

Windows 环境下Docker 安装伪分布式 Hadoop 1、环境2、拉取镜像3、启动容器4、预备操作4.1安装vim4.1.1 更新软件包信息4.1.2 安装vim 4.2 换源4.2.1 备份镜像源设置文件4.2.2 编辑镜像源设置文件4.2.3 重新更新一下软件包信息 4.3 同步上海时间4.3.1 安装 tzdata4.3.2 设置 tz…

帮你解析复杂的C语言声明

很多C/C的初学者&#xff0c;常常被一些复杂的声明语句弄得晕头转向&#xff0c;满头雾水。比如说&#xff1a;char *(*(*a[])())()&#xff0c;这个声明是什么意思呢&#xff1f; 不用抓耳挠腮&#xff0c;在linux环境下&#xff0c;有一个工具能帮我们解析&#xff0c;它就是…

【记】又一轮的笔试结束

3月15日&#xff0c;晴空万里。 我早早起床去参加gs软件开发的宣讲会&#xff0c;我自己一个人。坐车的时候有了点小插曲&#xff0c;但是很快就到了数字大厦&#xff0c;当时不到9点。 好不容易找到了指定的酒店&#xff0c;高达24层的展示厅让我有点紧张&#xff0c;不过好…

eth1 似乎不在。将要推迟它的初始化

刚装了台机器&#xff0c;Linux系统&#xff0c;上面有两张网卡&#xff0c;安装过程中配置了静态的IP。安装结束后&#xff0c;发现静态IP和物理网卡的绑定&#xff0c;和预期的不同&#xff0c;绑定反了。三下五除二&#xff0c;把/etc/sysconfig/network-scripts下的ifcfg-e…

python的pexpect模块

Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现&#xff0c;是一个用来启动子程序&#xff0c;并使用正则表达式对程序输出做出特定响应&#xff0c;以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广&#xff0c;可以用来实现与 ssh、ftp 、telnet 等程序…

查看RPM包里的内容

有时候&#xff0c;拿到一个RPM&#xff0c;并不想安装它&#xff0c;而想了解包里的内容&#xff0c;怎么办呢&#xff1f; 如果只相知道包里的文件列表执行&#xff1a; #rpm -qpl packetname 如果想要导出包里的内容&#xff0c;而不是安装&#xff0c;那么执行&#xff1a;…

经典智力题:拿球问题

问题描述&#xff1a; 假设排列着100个乒乓球&#xff0c;由两个人轮流拿球装入口袋&#xff0c;能拿到第100个乒乓球的人为胜利者。条件是&#xff1a;每次拿球者至少要拿1个&#xff0c;但最多不能超过5个&#xff0c;问&#xff1a;如果你是最先拿球的人&#xff0c;你该拿…

生产上的部署脚本功能

#!/bin/bash #author by jackluo#要过滤的文件 ExcludeFile(api.md dev.md .git .gitignore .htaccess .project README.md) #定义要copy的目录 new_git_code_dir/data/projects/你自己的git仓库路径 production_code_dir/data/projects/你生产上面的路径/ #检查这个字段是否存…