/**
* @author SunnyMoon
*/
/**********
* 概念介绍:
* ********
*处理小划分:
* 1. 如果使用三数据项取中值的方法取枢纽,这时快速排序算法不能执行三个或者小于三个数据项
* 的划分规则,这时数字3就为排序算法的切割点。在上一篇中对三个或三个以下的数据排序时
* 使用手动的方式排序,这种方式实践中不是最好的选择。
* 2. 处理小划分的另一个选择是使用插入排序,当使用插入排序时可以将划分设定为10或其它任何
* 数,试验不同的切割点的值以找到最佳的切割点,专家推荐使用9为切割点。对小的子数组使用
* 插入排序被证时为最快的一种方法。将插入排序和快速排序相结合,可以把快速排序的性能发挥
* 到极极,本篇程序使用该方法。
* 4. 第三个选择是对数组整个使用快速排序不考虑处理小划分,当结束时数据基本有序了,然后
* 使用插入排序对数据排序。因为插入排序对基本有序的数组执行效率很高,许多专家提倡使用
* 这种方法,但是插入排序对小规模的数据排序很适合,随着数据规模的扩大性能下降明显。
*
* 消除递归:
* 很多人提倡对快速排序算法进行修改,取消递归包括重写算法用栈实践。但是对于现在的
* 系统来说消除递归所带来的改进不是很明显。
*/
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 < 10) {
insertionSort(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 insertionSort(int left, int right) {
int in, out;//in为内循环指针,out为外循环指针
for (out = left + 1; out <= right; out++) {
long temp = theArray[out];//移除当前标记元素到临时变量
in = out;//定位内循环
while (in > left && theArray[in - 1] >= temp) {//满足条件时向左移动元素
theArray[in] = theArray[in - 1];
--in;
}
theArray[in] = temp;//插入当前标记元素到正确位置
}
}
}
/**
* 主类
*/
public class QuickSort3 {
public static void main(String[] args) {
int maxSize = 10;
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=56 14 50 18 82 58 30 50 60 1
* 显示排序后数据
* A=1 14 18 30 50 50 56 58 60 82
*/
/**
* 总结:
* 快速排序是常用排序中效率最高的一种排序方式。
* 但在应用中的一此特殊情况影响他的效率,这不是算法本身的问题,而是如果实现的问题。
* 三数据项选中方法很好的解决了这样的问题。三数据选中方法不是最好的选择,可以将插入排序
* 与快速排序相结合的方式解决这样的问题,使快速排序算法发挥到极致。
*/
分享到:
相关推荐
在编程领域,数据结构与算法是核心组成部分,它们直接影响到程序的效率和性能。Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点...
在Java中,我们可以使用各种算法来解决实际问题,例如排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)、查找算法(顺序查找、二分查找、哈希查找)以及图论中的最短路径算法(Dijkstra算法...
本资源包含两部分:一本名为“数据结构与算法(JAVA语言版)”的PDF教程和一个“源码.zip”压缩包,提供了相关的Java实现。 1. 数据结构:数据结构是组织和存储数据的方式,它直接影响到算法的效率。常见的数据结构...
在《数据结构与算法分析》中,作者不仅讲解了多种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等,还深入探讨了查找算法,包括线性查找、二分查找、哈希查找等,并分析了它们在时间复杂度...
资源摘要信息是关于Java数据结构和算法的知识点总结,涵盖了数组、栈与队列、链表、递归、哈希表、高级排序、二叉树、红黑树、堆、带权图等数据结构和算法概念。 一、数组 * 数组是相同类型变量的集合,可以使用...
《Java数据结构和算法中文第二版》是一本深入探讨Java编程中数据结构和算法的书籍。数据结构是计算机科学的基础,它涉及到如何有效地组织和存储数据,以便在各种操作下高效地访问和修改。算法则是解决问题的具体步骤...
本资料包“数据结构与算法JAVA版”聚焦于这个核心主题,包含了用Java实现的各种数据结构和算法。 1. **数据结构**: - **数组**:是最基本的数据结构,提供了固定大小的存储空间,通过索引访问元素。Java中的数组...
数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。在Java环境下,这些概念的实现使得程序设计更加高效和优化。以下将详细介绍标题和描述中提到的关键知识点: 1. **栈与队列**: - 栈(Stack)...
这份“Java数据结构与算法+源代码高清版”资源旨在帮助开发者深入理解并掌握这些关键概念。 首先,让我们来探讨数据结构。数据结构是组织和存储数据的方式,它为算法提供了基础。常见的数据结构包括数组、链表、栈...
Java数据结构与算法是计算机科学中的基础且至关重要的部分,它们是解决问题和设计高效程序的核心。本书《Java数据结构与算法(第二版)》显然深入探讨了这些主题,旨在帮助读者提升编程技能和理解复杂问题的解决策略...
以下是对这三种语言在数据结构与算法方面的一些关键知识点的详细阐述: 1. **数据结构**: - **数组**:基本的数据结构,用于存储同类型元素的集合。C、C++中的数组是静态的,大小在声明时确定,而Java中的数组...
【数据结构与排序算法在Java中的应用】 在计算机科学中,数据结构是组织和存储数据的方式,而排序算法则是对这些数据进行排列的策略。在Java编程中,掌握各种排序算法对于提高程序效率至关重要。本篇文章将深入探讨...
本书“数据结构与算法(JAVA语言版)含源代码”旨在深入讲解这些概念,并通过Java语言实现来加强理解。以下将详细介绍书中可能涵盖的知识点。 1. **数据结构**: - **线性结构**:如数组、链表(单链表、双链表)...
本资源提供了"数据结构与算法Java语言描述(源代码)",帮助学习者通过实际代码深入理解这些概念。 1. **数组**:数组是最基本的数据结构,它允许存储固定数量的相同类型元素。在Java中,数组可以是一维、二维或...
这个“Java版本的数据结构和算法(Linux社区版)”压缩包显然是一个专注于Java语言的数据结构与算法的学习资源,特别强调了其原创性,暗示内容可能具有独特性和深度。 数据结构主要包括数组、链表、栈、队列、树、...
本资源提供了"数据结构与算法Java语言描述 第二版 部分代码实现",这意味着你将能够学习到如何使用Java来实现各种数据结构和算法。 1. **数组**:数组是最基本的数据结构,它允许存储固定大小的同类型元素集合。在...
4. 排序和查找:排序算法如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序,以及查找算法如线性查找、二分查找和哈希表查找,都是数据结构中的重要内容。 5. 栈和队列的应用:栈在函数调用、表达式求值...