/** 快速排序方法 */
public static void quickSort(int[] a, int lo0, int hi0) {
int lo = lo0;
int hi = hi0;
if (lo >= hi)
return;
// 确定指针方向的逻辑变量
boolean transfer = true;
while (lo != hi) {
if (a[lo] > a[hi]) {
// 交换数字
int temp = a[lo];
a[lo] = a[hi];
a[hi] = temp;
// 决定下标移动,还是上标移动
transfer = (transfer == true) ? false : true;
}
// 将指针向前或者向后移动
if (transfer)
hi--;
else
lo++;
// 显示每一次指针移动的数组数字的变化
for (int i = 0; i < a.length; ++i) {
System.out.print(a[i] + ",");
}
System.out.print(" (lo,hi) = " + "(" + lo + "," + hi + ")");
System.out.println("");
}
// 将数组分开两半,确定每个数字的正确位置
lo--;
hi++;
System.out.println("一趟。。区间:["+lo0+","+lo+"]["+hi+","+hi0+"]");
quickSort(a, lo0, lo);
quickSort(a, hi, hi0);
}
网上关于快速排序算法一大推,但仔细看了确发现都不是那么一回事,或许是我没找到对的吧!
还好在博客园找到了一篇http://www.cnblogs.com/yanzi629/archive/2010/11/20/1882863.html#commentform
对于快速排序我个人的理解是首先找出一个参照点设为p,排在p左边的都比p要小,右边的都比p要大,然后参照上面的方法把左右两边的数再一次进行排列一直到不能排了。
这是一种分治算法+递归的,容易理解,速度也很快,但是直观的用算法去描述没在网上找到好的描述算法,不过找到了一个基于此思想的更耳目一新的方法,该方法就是上面的代码,不过它是会设置参照点,而是基于机会相等的方法来缩小区间,这样减少了每个数字和其他数字比较的次数,代码中的指针transfer指示头索引和尾索引谁有机会向中间移动,当然这个机会是相等的,不相等要比相等理论上耗时。个人认为这个方法比设置基准点的描述算法好一些。
===============================================================================
2011-10-09 下午 编辑
java.util.Arrays.sort 的源码中对基本数据类型的排序实现是基于快排的
if (len < 7) {
for (int i=off; i<len+off; i++)
for (int j=i; j>off && x[j-1]>x[j]; j--)
swap(x, j, j-1);
return;
}
因为当数据量小的情况下快排就没有必要了,递归太浪费资源,一个递归就要入栈出栈,即便该方法什么也不做很浪费资源的,所以排序的数据小于7就用冒泡。
这里有个技巧,内部那个for循环是j--,也就是从高到低的循环,之所以这样写是因为如果你前面都进行了swap那么只用将条件x[j-1]>x[j]写到for的条件里面判断即可。
/**
* Returns the index of the median of the three indexed integers.
*/
private static int med3(int x[], int a, int b, int c) {
return (x[a] < x[b] ?
(x[b] < x[c] ? b : x[a] < x[c] ? c : a) :
(x[b] > x[c] ? b : x[a] > x[c] ? c : a));
}
这个方法目的是寻找a,b,c的中间的那个数,a,b,c可以看成是数组的头、中间、尾三个地方。
快速排序的最坏情况基于每次划分对主元的选择。基本的快速排序选取第一个元素作为主元。这样在数组已经有序的情况下,每次划分将得到最坏的结果。
于是就产生了几种变种,分别是:随机化快速排序、平衡快排、外部快排、三路基数快排。
jdk的源码选择的是平衡快排。
平衡快排:每次尽可能地选择一个能够代表中值的元素作为关键数据,然后遵循普通快排的原则进行比较、替换和递归。通常来说,选择这个数据的方法是取开头、结尾、中间3个数据,通过比较选出其中的中值。取这3个值的好处是在实际问题(例如信息学竞赛……)中,出现近似顺序数据或逆序数据的概率较大,此时中间数据必然成为中值,而也是事实上的近似中值。万一遇到正好中间大两边小(或反之)的数据,取的值都接近最值,那么由于至少能将两部分分开,实际效率也会有2倍左右的增加,而且利于将数据略微打乱,破坏退化的结构。
分享到:
相关推荐
在"QSortRows_floorveg_快速排序_neighbor6dd_整行排序_"这个主题中,我们看到的是快速排序算法的一种变体,它被应用于二维数据,即整行数据的排序。这与传统的快速排序处理一维数组有所不同。这个实现可能是为了...
本文将深入探讨标题和描述中提及的几种排序算法:直接插入排序、希尔排序(SHELL排序)、冒泡排序、快速排序、简单选择排序、堆排序以及归并排序,并对它们进行分析和比较。 1. **直接插入排序**: - 直接插入排序...
在"笔试题_快速排序_"中,可能包含的题目不仅限于快速排序的基本原理,还可能涉及其变种,如三向切分的快速排序、随机化版本的快速排序等。编程解法则可能是要求考生编写一个实现快速排序的Python程序,或者对已有...
以下是一个简单的Python快速排序实现: ```python def quick_sort(lst): if len(lst) return lst pivot = lst[0] less_than_pivot = [x for x in lst[1:] if x ] greater_than_pivot = [x for x in lst[1:] ...
快速排序和冒泡排序是两种常见的排序算法,它们在计算机科学和编程中有着广泛的应用。本文将详细解析这两种排序算法的原理、优缺点以及实际应用。 **快速排序** 是由英国计算机科学家C.A.R. Hoare在1960年提出的。...
本项目着重探讨了两种经典的排序算法——冒泡排序和快速排序,并通过C语言进行了实现。这两种排序算法各有特点,理解它们的工作原理及其优缺点对于提升编程技能和理解算法效率至关重要。 **冒泡排序** 是一种简单...
在这个"MFC.rar"压缩包中,我们看到涉及到的是使用MFC实现的几种排序算法,包括快速排序、冒泡排序以及另外三种经典的排序算法:堆排序、直接插入排序和简单选择排序。 快速排序是一种高效的排序算法,由C.A.R. ...
以下是一个简单的C++快速排序代码实现示例,基于上述步骤: ```cpp #include using namespace std; void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int partition(int arr[], int low, ...
3. 插入排序的优化:对于小规模的子序列,快速排序的递归开销可能超过简单插入排序的效率,因此可以设置一个阈值,当子序列长度小于阈值时,改用插入排序。 快速排序广泛应用于各种编程语言和系统中,是实际开发中...
本文将详细讨论在Java中实现的各种排序算法,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序以及其改进版本,还有归并排序和堆排序。这些算法在实际开发中有着广泛的应用,理解它们的工作原理和效率可以...
这里我们关注的是两种经典的排序算法:快速排序和冒泡排序。这两种排序方法各有特点,适用于不同的场景,并且它们的实现方式和效率都值得深入探讨。 首先,让我们来了解一下快速排序。快速排序是由英国计算机科学家...
这里我们关注的是两个经典的排序算法——冒泡排序和快速排序,它们都是用Python编程语言实现的。下面将详细介绍这两个排序算法及其应用。 首先,让我们来讨论冒泡排序。冒泡排序是一种简单的排序算法,其工作原理...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),即把一个大问题分解成若干个小问题来解决,最终将小问题的结果合并得到原问题的解。在这...
例如,快速排序通常比冒泡排序快,但后者对于小数据集可能更简单易懂。这种可视化工具对于教育和调试排序算法非常有用。 总之,"mfc-sort.zip"项目提供了一个实用的工具,它将理论知识与实践结合,帮助开发者和学习...
例如,简单的排序算法如冒泡排序易于理解和实现,而更高效的算法如快速排序或归并排序则能提供更好的性能。 4. **冒泡排序**:冒泡排序是一种简单的排序算法,通过不断交换相邻的未排序元素来逐步将最大(或最小)...
在本实验中,我们主要探讨了三种经典的排序算法:插入排序、快速排序和选择排序。这些排序算法是计算机科学中的基础,特别是在数据结构和算法领域。以下是对这三种排序算法的详细说明: **插入排序(Insertion Sort...
这个压缩包文件“内部排序的主要算法及相关可实现程序.rar”包含了多种内部排序算法的实现,其中包括希尔排序(Hill Sort)、插入排序以及其他的经典排序算法,如选择排序、快速排序、堆排序和归并排序。下面将详细...
在这个名为“qksort.zip_qk_sort_qksort排序_sequencing”的压缩包中,包含了对这种新快速排序方法的描述和可能的实现代码。 快速排序的基本思想是分治法。它通过选取一个“基准”元素,将数组分为两个子数组:一个...
以下是一个简单的C#快速排序的实现: ```csharp public class QuickSortDemo { public static void QuickSort(int[] arr, int left, int right) { if (left ) { int pivotIndex = Partition(arr, left, right); ...