【大话数据结构算法】快速排序算法
快速排序是交换类的排序,比如在站队的时候,老师说:“第一个同学出列,其他同学以第一个同学为中心,比他矮的全排在左边,比他高的全排在右边。”这就是一趟快速排序。可以看出,一趟快速排序是以一个“枢轴”为中心,将序列分成两个部分,枢轴的一边全是比它小(或者小于等于)的,另一边则全是比它大(或者大于等于)的。
快速排序算法采用了一种分治的策略,通常称其为分治法,其基本思想是:
1、先从数列中取出一个数作为基准数;
2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边;
3、再对左右区间重复第二步,直到各区间只有一个数。
以一个简单的数组为例,我们来看一下,快速排序算法的排序过程:
再对array[0…1]和array[3..4]重复上述操作步骤就行了。
注意:在一次查找中只有i和j的值在变,X的值是一直保持不变的。
以上步骤总结为:
1、i=l,j=r,x=array[i];
2、j- -从后向前找小于等于x的数,找到后用array[j]替代array[i];
3、i++从前向后找大于x的数,找到后用array[i]替代array[j];
4、一直重复执行2、3步骤,直到i=j为止,最后将基准数写入array[i]。
算法实现如下:
int quickSort(int s[], int l, int r){int i = l, j = r;int x = s[l]; //s[l]即s[i]为基准数/枢轴while (i < j){// 从右向左找小于x的数来替换s[i]while(i < j && s[j] >= x) {j--;}if(i < j){s[i] = s[j];i++;}// 从左向右找大于或等于x的数来替换s[j]while(i < j && s[i] < x){i++;}if(i < j){s[j] = s[i];j--;}}//退出时,i等于j。将基准数填到这个位置上。s[i] = x;//返回调整后基准数的位置return i;
}
java代码实现如下:
public class quickSortDemo {public static void quickSort(int[] array, int left,int right){if (left < right){int i = left, j = right, x = array[left];//从右向左找第一个小于x的数放到array[i]中while (i < j){while(i < j && array[j] >= x){j--; }if(i < j){array[i] = array[j];i++;//等价于array[i++] = array[j]}//从左向右找第一个大于等于x的数放到array[j]中while(i < j && array[i] < x){i++; }if(i < j){array[j] = array[i];j--;//等价于array[j--] = array[i]}}array[i] = x;//递归调用quickSort(array, left, i - 1); quickSort(array, i + 1, right);}}public static void main(String[] args) {int[] array = {2,7,9,3,5,6,1,8};quickSort(array,0,7);for (int k = 0; k < array.length; k++) {System. out.println(array[k]);}}
}
时间复杂度:
快速排序算法最好情况下的时间复杂度为O(N*logN){以2为底数},待排序序列越接近无序,算法效率越高。最坏情况下的时间复杂度为O(N2){n的平方},待排序序列越接近有序,算法效率越低。平均时间复杂度为O(N***logN){以2为底数}**。就平均时间而言,快速排序算法是所有排序算法中最好的快速排序的排序趟数和初始序列有关。
空间复杂度:
快速排序算法的空间复杂度为O(logN){以2为底数},快速排序是递归进行的,递归需要栈的辅助,因此快速排序算法需要的辅助空间比其他的排序算法多。
【大话数据结构算法】快速排序算法相关推荐
- 十大经典排序算法-快速排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 大话数据结构:最短路径算法
dijkstra最短路径算法 迪杰斯特算法的核心是首先正向把离起点最近的点一个一个找出来,然后从终点开始逆向计算最短路径 利用图数据结构实现dijkstra算法的伪代码如下 {记录所有点到起点的距离并 ...
- 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))
本文根据<大话数据结构>一书,实现了Java版的一个简单的散列表(哈希表). 基本概念 对关键字key,将其值存放在f(key)的存储位置上.由此,在查找时不需比较,只需计算出f(key) ...
- 用openAI写个js的排序算法(快速排序算法)
文章目录 一.生成JS快速排序算法 二.openai还会给出调用方法 一.生成JS快速排序算法 这是一个通用的 JavaScript 排序算法.它使用的是快速排序算法. function sort(a ...
- 读大话数据结构之二--------算法(上)
本章由高斯计算从1加到100的思想引入算法之间的比较.从而引入一个话题:什么是算法.算法其实就是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或者多个操作. 讲述了算 ...
- 数据结构之快速排序算法(C语言版)
快速排序是学习数据结构必须掌握的一种排序方法,效率很高,经过老师的讲解很想和大家分享~ 下面举一个例子来说明. 例如数组:19 6 3 78 34 10 一.找出枢轴并把数组划分成块,枢轴前面的都比枢 ...
- 排序算法——快速排序算法
快速排序的基本思想: 通过一趟排序将待排记录分隔成独立的两部分,一部分记录的关键字比基准值小,一部分记录的关键字比基准值大,然后再对这两部分进行同样操作. 1.快速排序递归算法 //快速排序,递归 i ...
- 排序算法 | 快速排序算法原理及实现和优化(一)
快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出. 快速排序的基本思想是:通过一趟排序将要排序的数 ...
- 排序算法:快速排序算法实现及分析(递归形式和非递归形式)
快速排序算法介绍 从名字上就可以看出快速排序算法很嚣张,直接以快速命名.确实快速排序 的确很快速,被列为20世纪十大算法之一.程序员难道不应该掌握么.快速排序(Quick Sort)的基本思想是:通过 ...
- 快速排序算法(基于Java实现)
title: 快速排序算法(基于Java实现) tags: 快速排序算法 快速排序算法的原理与代码实现: 一.快速排序算法的原理 快排算法的思想是: 如果需要排序数组中下标从p到r之间的一组数据,我们 ...
最新文章
- android关于设置list_item高度问题
- 关于计算机和人物的英语短文,人脑和电脑英语作文
- python基础(part9)--容器类型之集合
- 【Paper-Attack Defense】Adversarial Label-Flipping Attack and Defense for Graph Neural Networks
- mysql主从io为no_mysql主从同步错误解决和Slave_IO_Running: NO
- H - A Shooting Game
- python爬虫使用模块_10分钟教你Python爬虫(下)--爬虫的基本模块与简单的实战...
- 盘点前端HTML基础知识
- zuc算法代码详解_密码学算法之序列密码中的ZUC算法详解
- C++标准委员会7月科隆会议中投票通过的特性
- 平面波超声成像 (Matlab Filed II仿真)
- wps里面函数怎么使用_WPS表格中常用文本函数的用法
- 高德离线数据api_高德开放平台数据开放情况和调用实验
- ACM基础题——小刘认亲
- OpenStack--炼数成金
- HTML5页面跳转的几种方法
- 2019-07-12 函数递归、二分法、匿名函数、三元表达式、内置函数
- 软件项目管理工具,JAVA WEB 框架技术(结合实际工作经验,全是干货)
- ctfshow 网络迷踪-狗哥去哪
- 蓝桥杯备赛经验分享---如何拿蓝桥国一?