快速排序是通用排序中(针对内存中)最为流行的算法,其时间效率为O(n * log n)。
其关键算法是基于划分的排序。
划分只将数组中任意一个元素作为枢纽值,经过交换,使得数组中排列成所有小于枢纽的数值都在枢纽左边,而所有大于枢纽的数值都在枢纽右侧,然后返回枢纽的位置。注意,枢纽的选择可以是任意的。
快排选择将给定数组范围的的第一个数字作为枢纽,然后将数组分为两部分,大于枢纽的,小于枢纽的。然后对这两部分递归调用快速排序。
快排在极端情况下可能出现效率底下问题,这与枢纽的选取的策略有关,加入数组完全逆序,则枢纽总会选取指定范围中最大的值,只是一次简单交换,没有将数组有效划分两个部分。因此可以调整枢纽选取策略来修正这个问题,比如在给定范围中前中后三个位置选取三个值,选择值为中间的位置作为枢纽,这样可以一定程度上避免极端问题。
其他速度较快的,且很少出现极端情况的排序方法见希尔排序
代码如下:
class Quick {
public static void main(String[] args) {
int[] a = {6,9,5,4,2,45,23,45,53,3,7};
int pos = getPartitionPos(a,0,a.length);
sort(a,0,a.length);
println(a);
}
public static void println(int[] a) {
for(int i: a) System.out.print(i + " ");
System.out.println();
}
public static void sort(int[] a,int begin, int end) {
if(begin >= end) return;
int pos = getPartitionPos(a,begin,end);
sort(a,begin,pos);
sort(a,pos + 1, end);
}
private static int getPartitionPos(int[] a, int begin, int end) {
int pos = begin;
int value = a[begin];
while(true) {
while(begin < end && a[--end] > value); //从结尾向左找到第一个比枢纽小的数值
while(begin < end && a[++begin] < value); //从结尾向右找到第一个比枢纽大的数值
if(begin < end) { //如果需交互
a[pos] = a[end]; //将比枢纽小的值放在空位
a[end] = a[begin]; //将比枢纽大的值放在原来从右向左第一个比枢纽小的值的位置上
pos = begin; //将从左向右第一个比枢纽大的值的位置标志为空位
} else break;
}
if(pos != begin) { //如果空位与结束位置不等
a[pos] = a[begin]; //将空位置为结束时位置的值
a[begin] = value; //将结束位置放置枢纽
} else a[pos] = value;
return begin;
}
}
同样代码还可以这样:
class Quick2 {
public static void main(String[] args) {
int[] a = {1501,545,414,78,3,18,611,578,114,125,94,67,157};
sort(a,0,a.length);
print(a);
}
public static void sort(int[] a,int p1,int p3) {
if((p3-p1) <= 1) return;
int p2 = get(a,p1,p3);
sort(a,p1,p2);
sort(a,p2+1,p3);
}
public static int get(int[] a,int b, int e) {
int pos=b, temp=a[b];
boolean dir = true;
while(b<e) {
if(dir) {
if(a[--e] <= temp) {
a[pos] = a[e];
pos = e;
dir = false;
}
} else {
if(a[++b] >= temp) {
a[pos] = a[b];
pos = b;
dir = true;
}
}
}
a[pos] = temp;
return pos;
}
private static void print(int[] a) {
for(int i: a) System.out.print(i + " ");
System.out.println();
}
}
分享到:
相关推荐
算法-理论基础- 排序- 快速排序(包含源程序).rar
典型排序算法的c语言实现
貌似这个不大好理解,如果想理解程序怎样设计可以看看我的代码。。欢迎交流指正
最快的排序算法 谁才是最强的排序算法:快速排序-归并排序-堆排序,排序算法数据结构
归并排序,排序等算法,数据结构,快速排序,链表排序归并排序,排序等算法,数据结构,快速排序,链表排序
快速排序 非递归实现方式的完整源代码和测试结果。
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
冒泡排序---选择,插入和快速排序 简单实用,非常棒的一个java工具类.
快速排序-flash演示 可自己输入数据.......
数据结构--快速排序C++源代码,自己编写调试,代码简单易懂,不长
选择排序 冒泡排序 插入排序 合并排序 快速排序算法原理及代码实现 不同排序算法时间效率的经验分析方法 验证理论分析与经验分析的一致性 当面临巨大数据量的排序的时候,还是优先选择合并排序算法和快速排序算法。...
多线程实现排序算法的比较:希尔排序、快速排序、堆排序。用java语言实现,很经典,需要的可以下载看看!
详解Java常用排序算法-快速排序
java代码-使用java解决java排序之-快速排序的问题的源代码 ——学习参考资料:仅用于个人学习使用!
快速排序快速排序 快速排序 快速排序 快速排序 快速排序
快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序...
8.12-8.19_冒泡_选择_插入_希尔_快速_归并_基数_堆排序_排序算法Swift代码及UI演示
基于python的排序算法-快速排序Quick Sort
《算法设计与分析》实验报告---快速排序.pdf
实验内容及要求: 输入n个整数,分别用希尔排序、快速排序、堆排序和归并排序实现由小到大排序并输出排序结果。要求n=10,15,20进行三组排序实验。 实验目的:掌握希尔排序、快速排序、堆排序、归并排序算法。