/**
*
* @author SunnyMoon
*/
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
* 概念介绍:
* *****************************************************************************
*
* 影响效率的最大障碍:
* 对枢纽数据的选择是影响排序的效率。上一篇文章选择枢纽数据为数组的最后一个元素,
* 这么选择只是为方便,然而却造成了特殊情况时效率极度下降,降到O(n2)。这种特情况就是当数据为逆序的时候。
* 如果改变特殊情况给快速排序带来的致命影响呢,这将在这一专题中简要介绍。
*
* 三数据项取中划分:
* 目前已经有很多选择更好的枢纽的方法,选择任意一个数据项作为枢纽是一种简单的方法,便是
* 正如前文看到的那样,在特殊情况下性能很低。从理论上讲实际使数组中值数据是最理想的枢纽
* 选择,是效率最高的方式,但实际上这个过程比排序本身需要更长的时间,因此这是不可行的。
* 一种折衷的方法,选择数组里的第一个,最后一个以及中间位置的数据中选择一个中间值,并设
* 置此数据项为枢纽,这种选择枢纽的方式为三数据项选中。
* 查找三个数据项的中值数据项比查找所有数据项中值快很多,在大多数通常情况下这种方法是又
* 快又有效的方法。但是有很特殊的数据排列命名三数据项先中的方法也很低效。
*
////////////////////////////////////////////////////////////////////////////////
/**
* 定义一个数组类,封装了对自身数据的排序。
*/
class ArrayIns {
private long[] theArray;
private int nElems;
public ArrayIns(int max) {
theArray = new long[max];
nElems = 0;
}
public void insert(long value) {
theArray[nElems] = value;
nElems++;
}
public void display() {
System.out.print("A=");
for (int j = 0; j < nElems; j++) {
System.out.print(theArray[j] + " ");
}
System.out.println("");
}
/**
* 快速排序主方法
*/
public void quickSort() {
recQuickSort(0, nElems - 1);
}
/**
* 递归调用快速的排序核心方法
* @param left
* @param right
*/
public void recQuickSort(int left, int right) {
int size = right-left + 1;
if (size <= 3) {
manualSort(left, right);
} else {
long median = medianOf3(left, right);//三数取中值
int partition=partitionIt(left,right,median);//三数据取中值作为枢纽进行划分
recQuickSort(left, partition - 1);//递归排序数组左子元素
recQuickSort(partition + 1,right);//递归排序数据左子元素
}
}
/**
* 三数据选中
* @param left
* @param right
* @return
*/
public long medianOf3(int left, int right) {
int center = (left + right) / 2;
if (theArray[left] > theArray[center]) {
swap(left, center);
}
if (theArray[left] > theArray[right]) {
swap(left, right);
}
if (theArray[center] > theArray[right]) {
swap(center, right);
}
swap(center, right - 1);
return theArray[right - 1];
}
/**
* 交换数据
* @param dex1
* @param dex2
*/
public void swap(int dex1, int dex2) {
long temp = theArray[dex1];
theArray[dex1] = theArray[dex2];
theArray[dex2] = temp;
}
/**
* 根据三数据选中进行划分
* @param left
* @param right
* @param pivot
* @return
*/
public int partitionIt(int left, int right, long pivot) {
int leftPtr = left;//定位到最左元素
int rightPtr = right-1;//定位到枢纽
while (true) {
while (theArray[++leftPtr] < pivot);//寻找大于枢纽元素
while (theArray[--rightPtr] > pivot);//寻找小于枢纽元素
if (leftPtr >= rightPtr) {//确定划分结束退出循环
break;
} else {
swap(leftPtr, rightPtr);//交换需划分的元素
}
}
swap(leftPtr, right-1);//恢复枢纽到正确位置
return leftPtr;//返回枢纽
}
/**
* 手动排序
* @param left
* @param right
*/
public void manualSort(int left, int right) {
int size = right-left + 1;
if (size <= 1) {//当元素为1时直接返回
return;
}
if (size == 2) {
if (theArray[left] > theArray[right]) {//当元素为2时排序
swap(left, right);
}
return;
} else {//当元素为3时排序
if (theArray[left] > theArray[right - 1]) {
swap(left, right - 1);
}
if (theArray[left] > theArray[right]) {
swap(left, right);
}
if (theArray[right - 1] > theArray[right]) {
swap(right - 1, right);
}
}
}
}
/**
* 主类
*/
public class QuickSort2 {
public static void main(String[] args) {
int maxSize = 15;
ArrayIns arr = new ArrayIns(maxSize);
for (int j = 0; j < maxSize; j++) {//随机生机数据插入数组中
long n = (int) (java.lang.Math.random() * 99);
arr.insert(n);
}
System.out.println("显示排序前数据");
arr.display();
arr.quickSort();
System.out.println("显示排序后数据");
arr.display();
}
}
/**
*运行结果:
*显示排序前数据
*A=38 62 44 89 50 91 36 60 47 22 83 7 33 31 38
*显示排序后数据
*A=7 22 31 33 36 38 38 44 47 50 60 62 83 89 91
*/
/**
* 总结:
* 快速排序是常用排序中效率最高的一种排序方式。
* 但在应用中的一此特殊情况影响他的效率,这不是算法本身的问题,而是如果实现的问题。
* 三数据项选中方法很好的解决了这样的问题。
*/
分享到:
相关推荐
根据提供的文件信息,以下是关于《数据结构与算法分析_java语言描述_Mark_Allen_Weiss著_课后习题答案》中所涉及的知识点。 首先,本书的标题明确指出了它主要关注两个方面:数据结构和算法分析,同时使用Java语言...
在Java中,我们可以使用各种算法来解决实际问题,例如排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)、查找算法(顺序查找、二分查找、哈希查找)以及图论中的最短路径算法(Dijkstra算法...
在编程领域,数据结构与算法是核心组成部分,它们直接影响到程序的效率和性能。Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点...
本资源包含了《数据结构与算法分析》一书的Java语言描述中文第二版,以及配套的习题答案,无论是英文还是中文,都能为学习者提供详实的学习材料。 在数据结构方面,书中会详细介绍各种基本和高级的数据组织方式,...
数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。...通过阅读《数据结构与算法(JAVA语言版)》这本书,你将深入理解这些概念,并能熟练运用Java语言实现它们,从而提升你的编程能力。
《Java数据结构和算法中文第二版》是一本深入探讨Java编程中数据结构和算法的书籍。数据结构是计算机科学的基础,它涉及到如何有效地组织和存储数据,以便在各种操作下高效地访问和修改。算法则是解决问题的具体步骤...
数据结构与算法是计算机科学的基础,对于任何编程语言来说,理解和掌握它们都是至关重要的,特别是对于Java这样的高级语言。在Java中实现数据结构和算法,能够帮助开发者更高效地解决问题,提升程序性能。 数据结构...
主要分为排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序)、搜索算法(如线性搜索、二分搜索、深度优先搜索、广度优先搜索)、图算法(如Dijkstra算法、Floyd算法)等。掌握算法能帮助我们...
《Java数据结构与算法中文版》是一本深入探讨编程核心领域的书籍,主要针对Java程序员,旨在提升他们在数据处理和问题解决能力上的技能。这本书详细介绍了数据结构和算法的基础理论及其在Java语言中的实现,是Java...
本书《Java数据结构与算法(第二版)》显然深入探讨了这些主题,旨在帮助读者提升编程技能和理解复杂问题的解决策略。下面将详细阐述相关知识点。 1. **数据结构**: - **数组**:基础的数据结构,用于存储固定...
资源摘要信息是关于Java数据结构和算法的知识点总结,涵盖了数组、栈与队列、链表、递归、哈希表、高级排序、二叉树、红黑树、堆、带权图等数据结构和算法概念。 一、数组 * 数组是相同类型变量的集合,可以使用...
《数据结构与算法分析》是计算机科学领域的一本经典著作,尤其在Java版本中,它深入探讨了如何在Java编程语言中实现各种数据结构和算法。这本书不仅提供了理论知识,还通过提供源代码实例,帮助读者更好地理解和应用...
《Java数据结构与算法第二版源代码》是一个深入学习Java编程和算法的重要资源,它包含了丰富的实例和程序,旨在帮助开发者提升对数据结构和算法的理解与应用能力。在这个压缩包中,有两个主要的子文件:...
《数据结构与算法分析_Java语言描述(第2版) 源代码》是一本深入探讨数据结构和算法的书籍,其源代码是学习和理解书中理论的重要实践资源。这本书籍主要面向计算机科学专业的学生以及对算法有深入研究需求的开发者。...
《数据结构与算法分析》是计算机科学领域的一本经典教材,尤其对于学习Java编程的开发者来说,这本书提供了深入理解数据结构和算法的宝贵资源。Java语言描述的第二版更是为Java程序员提供了针对性的学习材料。书中的...
以下是基于标题“数据结构与算法-java”及描述中提到的“数据结构与算法分析_Java语言描述高清版(第2版)1.pdf”所涵盖的一些关键知识点: 1. **数据结构**: - **数组**:最基础的数据结构,存储固定大小的同类型...
本资料包“数据结构与算法JAVA版”聚焦于这个核心主题,包含了用Java实现的各种数据结构和算法。 1. **数据结构**: - **数组**:是最基本的数据结构,提供了固定大小的存储空间,通过索引访问元素。Java中的数组...
这里涉及的主要算法类型有排序算法(如冒泡排序、快速排序、归并排序、堆排序)、查找算法(如线性搜索、二分查找)、图算法(如深度优先搜索、广度优先搜索)以及动态规划、贪心算法和回溯法等。排序算法用于调整...
数据结构与算法是计算机科学的基础,对于任何编程语言来说,理解和掌握它们都是至关重要的,特别是对于Java这样的高级语言。在Java中实现数据结构和算法,能够帮助开发者编写更高效、可维护的代码。 《Java数据结构...