快速排序--java实现

Posted Java后端技术栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序--java实现相关的知识,希望对你有一定的参考价值。

什么是快速排序?

维基百科给出的定义

Quicksort(有时称为分区交换排序)是一种O(n log n)高效 排序算法,用作按顺序放置随机访问 文件或数组元素的系统方法。由英国计算机科学家Tony Hoare于1959年开发并于1961年发表,它仍然是一种常用的排序算法。如果实施得当,它可以比其主要竞争对手快两到三倍,合并排序和堆垛。


Quicksort是一种比较排序,意味着它可以对任何类型的项目进行排序,其中定义了“小于”关系(正式,总顺序)。在高效实现中,它不是稳定的排序,这意味着不保留相等排序项的相对顺序。Quicksort可以在阵列上就地操作,需要少量额外的内存来执行排序。它与选择排序非常相似,只是它并不总是选择最坏情况的分区。

快速排序算法的动画可视化。水平线是枢轴值。

 类 排序算法

最糟糕的表现 O(n的2次方)

最佳表现 O(n log n)

平均表现 O(n log n)

最坏的空间复杂性 O(n)


快速排序的数学分析表明,平均而言,该算法需要进行O(nlogn)比较来排序n个项目。在最坏的情况下,它会进行O(n的2次方)比较,尽管这种行为很少见。


java代码如下:

public class QuikSortDemo {
public static void main(String[] args) {
int[] data = {3, 6, 1, 9, 4, 2, 5, 12, 10, 7};
sort(data, 0, 9);
for (int a : data) {
System.out.print(a + " ");
}
}

public static void sort(int[] a,int low,int high){
int start = low;
int end = high;
int key = a[low];
while(end>start){
//从后往前比较
while(end>start&&a[end]>=key)
//如果没有比关键值小的,比较下一个,
// 直到有比关键值小的交换位置,
// 然后又从前往后比较
end--;
if(a[end]<=key){
int temp = a[end];
a[end] = a[start];
a[start] = temp;
}
//从前往后比较
while(end>start&&a[start]<=key)

//如果没有比关键值大的,比较下一个,

//直到有比关键值大的交换位置

start++;
if(a[start]>=key){
int temp = a[start];
a[start] = a[end];
a[end] = temp;
}

//此时第一次循环比较结束,

//关键值的位置已经确定了。

//左边的值都比关键值小,

// 右边的值都比关键值大,

//但是两边的顺序还有可能是不一样的,

//进行下面的递归调用

}
//递归

if(start>low)

          //左边序列。第一个索引位置到关键值索引-1
sort(a,low,start-1);

if(end<high)

          //右边序列。从关键值索引+1到最后一个
sort(a,end+1,high);
}
}


结果

快速排序--java实现


这里借鉴于网上的两张图

第一轮排序:

另外一张图就是每轮排序

以上是关于快速排序--java实现的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-排序之快速排序(使用Java代码实现)

数据结构-排序之快速排序(使用Java代码实现)

快速排序Java代码简洁实现

Java实现快速排序详细代码

高级排序java实现(希尔归并快速)

2021-10-21java:六千字快速复习七种常用排序