如何理解java数据结构中的快速排序方法

作者&投稿:宾晴 (若有异议请与网页底部的电邮联系)
如何用java实现快速排序,简答讲解下原理~

快速排序思想:
通过对数据元素集合Rn 进行一趟排序划分出独立的两个部分。其中一个部分的关键字比另一部分的关键字小。然后再分别对两个部分的关键字进行一趟排序,直到独立的元素只有一个,此时整个元素集合有序。
快速排序的过程,对一个元素集合R[ low ... high ] ,首先取一个数(一般是R[low] )做参照 , 以R[low]为基准重新排列所有的元素。
所有比R[low]小的放前面,所有比R[low] 大的放后面,然后以R[low]为分界,对R[low ... high] 划分为两个子集和,再做划分。直到low >= high 。
比如:对R={37, 40, 38, 42, 461, 5, 7, 9, 12}进行一趟快速排序的过程如下(注:下面描述的内容中元素下表从 0 开始):
开始选取基准 base = 37,初始位置下表 low = 0 , high = 8 , 从high=8,开始如果R[8] < base , 将high位置中的内容写入到R[low]中, 将high位置空出来, low = low +1 ;
从low开始探测,由于low=1 , R[low] > base ,所以将R[low]写入到R[high] , high = high -1 ;
检测到low < high ,所以第一趟快速排序仍需继续:
此时low=1,high=7,因为 R[high] < base ,所以将 R[high] 写入到到R[low]中,low = low + 1;
从low开始探测,low = 2 , R[low] >base ,所以讲R[low]写入到R[high],high=high-1;
继续检测到 low 小于high
此时low=2,high=6,同理R[high] < base ,将R[high] 写入到R[low]中,low=low+1;
从low继续探测,low = 3 , high=6 , R[low] > base , 将R[low]写入到R[high]中,high = high-1;
继续探测到low小于high
此时low=3,high=5,同理R[high] < base,将R[high]写入到R[low]中,low = low +1;
从low继续探测,low = 4,high=5,由于R[low] > base , 将R[low]写入到R[high]中,high = high -1 ;
此时探测到low == high == 4 ;该位置即是base所在的位置,将base写入到该位置中.
然后再对子序列Rs1 = {12,9,7,5} 和 Rs2={461,42,38,40}做一趟快速排序,直到Rsi中只有一个元素,或没有元素。
快速排序的Java实现:
private static boolean isEmpty(int[] n) {

return n == null || n.length == 0;
}

// ///////////////////////////////////////////////////
/**
* 快速排序算法思想——挖坑填数方法:
*
* @param n 待排序的数组
*/
public static void quickSort(int[] n) {
if (isEmpty(n))
return;
quickSort(n, 0, n.length - 1);
}

public static void quickSort(int[] n, int l, int h) {
if (isEmpty(n))
return;
if (l < h) {
int pivot = partion(n, l, h);
quickSort(n, l, pivot - 1);
quickSort(n, pivot + 1, h);
}
}

private static int partion(int[] n, int start, int end) {
int tmp = n[start];
while (start < end) {
while (n[end] >= tmp && start < end)
end--;
if (start < end) {
n[start++] = n[end];
}
while (n[start] < tmp && start < end)
start++;
if (start < end) {
n[end--] = n[start];
}
}
n[start] = tmp;
return start;
}
在代码中有这样一个函数:
public static void quickSortSwap(int[] n, int l, int h)
该函数可以实现,元素集合中特定的 l 到 h 位置间的数据元素进行排序。

1. 关键是在数组中选择一个元素作为比较对象来将原先的数组分为2部分,一部分比这个元素小,另外一部分比这个元素大,然后分别在两个数组中各选取一个元素进行比较排序.

原理:

快速排序也是分治法思想的一种实现,他的思路是使数组中的每个元素与基准值(Pivot,通常是数组的首个值,A[0])比较,数组中比基准值小的放在基准值的左边,形成左部;大的放在右边,形成右部;接下来将左部和右部分别递归地执行上面的过程:选基准值,小的放在左边,大的放在右边。。。直到排序结束。

步骤:

1.找基准值,设Pivot = a[0] 

2.分区(Partition):比基准值小的放左边,大的放右边,基准值(Pivot)放左部与右部的之间。

3.进行左部(a[0] - a[pivot-1])的递归,以及右部(a[pivot+1] - a[n-1])的递归,重复上述步骤。

 

排序效果:




学java需要什么基础?
因此要学用帮助文档。针对Java而言,要学会使用Java相关的API文档,也可以上网下载一些视频。如果想了解更多相关知识,建议到千锋教育了解一下。千锋教育在18个城市拥有22个校区,年培养优质人才超过20000人,和国内20000家企业都有人才输送合作关系,经常在网上发布免费的教学视频,影响人群近亿。

JAVA是什么软件,有什么用?
Java适宜于互联网的开发应用,其中一个原因是它使用了虚拟机,虚拟机是个用来解释Java指令的软件包,可以让Java在任何机器上运行,比如有运行在Mac或 UNIX下的虚拟机软件包。虚拟机并不是Java语言本身,它是个为特定机器编写的解释器软件。Java的虚拟机策略就相当于世界语,这是个人造的国际语言,目的是...

Java语言的特点
)JVM是Java平台无关的基础,在JVM上,有一个Java解释器用来解释Java编译器编译后的程序。Java编程人员在编写完软件后,通过Java编译器将Java源程序编译为JVM的字节代码。任何一台机器只要配备了Java解释器,就可以运行这个程序,而不管这种字节码是在何种平台上生成的。另外,Java采用的是基于IEEE标准的数据类型。通过JVM...

C++和JAVA的区别是什么?
C语言是经典的面向过程的编程语言,编程入门一般都学C语言以了解编程以及锻炼逻辑思维能力,在一些跟硬件比较紧密的编程中也经常用到。\\x0d\\x0a\\x0d\\x0aC++是在C语言的基础上加入了面向对象的概念,成为混合型面向对象语言,功能强大,但难度也大。\\x0d\\x0a\\x0d\\x0aJava是在C++的基础上进行...

Java平台是什么?其运行原理与一般的操作平台有何不同? 何为字节码?采 ...
Java平台:是sun公司开发的编程平台,后来被Oracle收购。这是一个程序开发和运行的平台。运行原理:底层是用c语言写的运行库,也可以说是jvm(java虚拟机)。它是编程平台,不是操作平台(我的理解是你说的操作平台就是操作系统),没有可比性。字节码:java程序写好后会被编译字节码,然后jvm装载该字节码...

java 单例模式这个要怎么理解?
1、要求生产唯一序列号。2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。3、创建的一个对象需要消耗的资源过多,比如 I\/O 与数据库的连接等。注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

求解,死活理解不了java面向对象的意思。。。
面向对象是一种编程的思想,并不是Java特性,只是Java支持面向对象。面向对象将程序中的各种元素视为对象,对象具有一定的职责,由多个对象互相协作来完成程序功能。举个简单的例子,简单计算器,这个应该所有Java的书都有教吧:(下面是伪代码)1.一般写法:\/\/读取第一个数a...\/\/读取运算符号x...\/\/...

昆明Java培训:为什么学习Java开发你知道吗?
然后学习下Ajax,要能够熟练的使用JSON和XML来做数据交互。以上内容学习完之后Java的基础部分就算是基本掌握了,下面就该学习一些框架了。建议先从Spring学起,Spring将成为你今后开发项目的核心框架。Spring也是现在项目中最常用的框架。可以深入的学习,试着去理解Spring的一些实现原理,这将有助于你更好的使用Spring。学完...

java学习心得
这样的代码别人看起来像天书,要理解谈何容易,更不用说维护了,必然会被无情地扫入垃圾堆。Java编码规范到此查看或下载http:\/\/Java.sun.com\/docs\/codeconv\/,中文的也有,啊,还要问我在哪,请参考3.2.2节。 3.2.5 不局限于Java 很不幸,很幸运,要学习的东西还有很多。不幸的是因为要学的东西太多且多变,没时间...

java与C++相比 优势有哪些?论文需要
Java有建立在公共密钥技术基础上的确认技术.指示器语义的改变将使应用程序不能再去访问以前的数据结构或是私有数据,大多数病毒也就无法破坏数据.因而,用Java可以构造出无病毒、安全的系统。 Java语言除上述主要特点外,还有高性能、分布性、强大性、解释性、可移植性等,此处不再 赘述。 3.Java语言的发展 Java自...

新干县13730076919: 如何理解java数据结构中的快速排序方法 -
别滢前列: 原理:快速排序也是分治法思想的一种实现,他的思路是使数组中的每个元素与基准值(Pivot,通常是数组的首个值,A[0])比较,数组中比基准值小的放在基准值的左边,形成左部;大的放在右边,形成右部;接下来将左部和右部分别递归地执行上面的过程:选基准值,小的放在左边,大的放在右边...直到排序结束.步骤:1.找基准值,设Pivot = a[0] 2.分区(Partition):比基准值小的放左边,大的放右边,基准值(Pivot)放左部与右部的之间.3.进行左部(a[0] - a[pivot-1])的递归,以及右部(a[pivot+1] - a[n-1])的递归,重复上述步骤. 排序效果:

新干县13730076919: 哪位帮我讲讲java中的快速排序法 -
别滢前列: 快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进...

新干县13730076919: 如何用java实现快速排序,简答讲解下原理 -
别滢前列: 快速排序思想: 通过对数据元素集合Rn 进行一趟排序划分出独立的两个部分.其中一个部分的关键字比另一部分的关键字小.然后再分别对两个部分的关键字进行一趟排序,直到独立的元素只有一个,此时整个元素集合有序. 快速排序的过程...

新干县13730076919: java中的快速排序法底层是如何实现的? -
别滢前列: 分为好几种,如果你看过源码的话,它是根据要排序的对象个数来进行区分的. 比如界定是N 当小于N的时候用的 是冒泡排序 当大于N的时候用的是快速排序如果是eclipse环境的话,在安装源码的前提下,很容易就能看到源码了. 其他问题百度一下,你就知道

新干县13730076919: 数据结构排序中的快速排序什么叫选取第一个中间一个和最后一个元素中的中间一个来作为基准 -
别滢前列: 为了避免出现较坏(复杂度较高)的情况出现,要选取一个较好的枢轴变量.对于较为随机的数组,可以选第一个数.一般也可以从前、中、后三个元素中选一个合适的作为枢轴变量.举一个例子:17...8...10,...表示省略的数.这时候,我们认为选10比较合适(8

新干县13730076919: 请问Java快速排序法是怎么算的? -
别滢前列: * 步骤为: * 1. 从数列中挑出一个元素,称为 "基准"(pivot), * 2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分割之后,该基准是它的最后位置.这个称...

新干县13730076919: Java快速排序法是怎么算的? -
别滢前列:/*** 快速排序* 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists).* 步骤为:* 1. 从数列中挑出一个元素,称为 "基准"(pivot),* 2. 重新排序数列,所有元素比基准值小的摆放在基准前面...

新干县13730076919: 数据结构里的快速排序怎样理解谁知道?
别滢前列: 快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边数列进行排序,而影响快速排序法效率的正是轴心的选择.

新干县13730076919: JAVA中有哪几种常用的排序方法 -
别滢前列: 1、冒泡排序 冒泡排序是一个比较简单的排序方法.在待排序的数列基本有序的情况下排序速度较快.若要排序的数有n个,则需要n-1轮排序,第j轮排序中,从第一个数开始,相邻两数比较,若不符合所要求的顺序,则交换两者的位置;直到第...

新干县13730076919: 数据结构 快速排序的原理是什么? -
别滢前列: 找一个值作为参考值,比参考值大的就放在右边,比参考值小的就放在左边.那么一趟完成后就将数组分成了两部分:参考值左边的都是小于参考值的数,参考值右边的都是大于参考值的数,然后分别递归求这两部分,最后得到的就是一个排好序的数组了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网