java数据结构与算法之快速排序详解
作者:android小猪 发布时间:2023-02-23 10:23:43
本文实例讲述了java数据结构与算法之快速排序。分享给大家供大家参考,具体如下:
交换类排序的另一个方法,即快速排序。
快速排序:改变了冒泡排序中一次交换仅能消除一个逆序的局限性,是冒泡排序的一种改进;实现了一次交换可消除多个逆序。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤:
1、从数列中挑出一个元素,称为 "基准"(pivot);
2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
算法实现代码如下:
package exp_sort;
public class QuickSort {
public static void Qsort(int array[], int left, int right) {
int pos;
if (left < right) {
pos = quickSort(array, left, right);
//递归排序
Qsort(array, left, pos - 1);
Qsort(array, pos + 1, right);
}
}
/**
* 一趟快速排序
*
* @param array
* @param left
* @param right
* @return
*/
public static int quickSort(int array[], int left, int right) {
int low, high;
int temp = array[left]; // 选择基准记录(枢纽元)
low = left;
high = right;
while (low < high) {
// high从右到左找小于temp的记录
while (low < high && array[high] >= temp) {
high--;
}
// 找到小于temp的记录则交换
if (low < high) {
array[low] = array[high];
low++;
}
// low从左到右找到大于temp的记录
while (low < high && array[low] < temp) {
low++;
}
// 找到大于temp的记录,则交换
if (low < high) {
array[high] = array[low];
high--;
}
}
//将游标放在当前位置,此时low=high
array[low] = temp;
return low;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int array[] = { 38, 62, 35, 77, 55, 14, 35, 98 };
Qsort(array, 0, 7);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println("\n");
}
}
枢纽元的选取:
1、基本的快速排序:选取地一个元素作为枢纽元。实际中应尽量避免将第一个元素作为枢纽元(极端情况是:初始状态是已排好序或者反序的)。
2、随机化快排序 : 随机的选取枢纽元。
3、平衡快排 : 三数中值分割法:枢纽元的最好选择是数组中的中值,该中值,即左端、右端和中心位置上的三个元素的中值(推荐)。
算法分析:该算法是在实践中最快的一种排序算法,它的平均运行时间是O(N log N),该算法之所以快,主要是由于非常精炼和高度优化的内部循环。它的最坏情况的性能是O(N^2),但是这种情况可以改变。快速排序是一种分治的递归算法。该算法比归并排序算法排序快。
1、最坏情况的分析
当枢纽元是最小元素时,此时就相当于是对整个数组进行递归排序,时间复杂度为:O(N^2)
2、最好情况的分析
枢纽元正好位于中间,此时是对两个子数组进行递归排序,时间复杂度是:O(N log N),这和归并排序的分析完全相同。
3、平均情况的分析
时间复杂度是:O( N log N)
希望本文所述对大家java程序设计有所帮助。


猜你喜欢
- 很多项目需要用到弹幕效果,尤其是在播放视频的时候需要一起显示别人发的弹幕,也包括自己的发的。今天就试着写了一下这个效果。思路就是将从右往左的
- 一、饿汉式(静态常量)public class Face { private stat
- OverView今天在复习的时候,突然复习到我们的相机操作,但是对于相机操作,对于我来说比较复杂的是对于权限的操作。所有我们需要对我们的相机
- 1.SQL注入:程序向后台数据库传递SQL时,用户提交的数据直接拼接到SQL语句中并执行,从而导入SQL注入攻击。字符型注入:黑色部分为拼接
- Android 版本更替,新的版本带来新的特性,新的方法。新的方法带来许多便利,但无法在低版本系统上运行,如果兼容性处理不恰当,APP在低版
- 相信大家肯定都在电商网站买过东西,当我们看中一件喜欢又想买的东西时,这时候你又不想这么快结账,这时候你就可以放入购物车;就像我们平时去超市买
- 一、前言无论承接什么样的需求,是不是身边总有那么几个人代码写的烂,但是却时常有测试小姐姐过来聊天(求改bug)、有产品小伙伴送吃的(求写需求
- java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一
- 使用@Tolerate实现冲突兼容使用Lombok能够减少程序员的重复工作提高工作效率,而Lombok的注解基本是基于标准的(如,标准的Bu
- JDK提供的流继承了四大类:InputStream(字节输入流)、OutputStream(字节输出流)、Reader(字符输入流)、Wri
- 这篇文章主要介绍了Java代码块与代码加载顺序原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- Eclipse ADT的Custom debug keystore自定义调试证书的时候,Android应用开发接入各种SDK时会发现,有很多
- 本文实例讲述了c#图像截取的实现方法。分享给大家供大家参考。具体如下:图像截取的相关代码如下: public Form1()&nb
- Java中避免NullPointerException的方法总结在字符串常量上调用equals// good"string lit
- 1、在ActionSupport中有一个validate()方法,这个方法是验证方法,它会在execute()方法执行之前执行,所以能够起到
- 本文实例讲述了C#实现json格式转换成对象并更换key的方法。分享给大家供大家参考。具体分析如下:由于是不标准的序列化对象类型,因此你无法
- 一. 线程池简介1. 线程池的概念:线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建
- 本文实例为大家分享了Android SQLite数据库连接实现登录功能的具体代码,供大家参考,具体内容如下布局文件border.xml<
- 一、为基本数据类型起别名typedef int myint;myint x = 5;"myint"是"int&
- 背景最近好几个项目在运行过程中客户都提出文件上传大小的限制能否设置的大一些,用户经常需要上传好几个G的资料文件,如图纸,视频等,并且需要在上