网站首页 > 技术文章 正文
快速排序算法总结:
平均时间复杂度O(NlogN) 最差的情况每次都比较情况下O(N*N)
算法的思想:
条件:
1.基准值作为比较值,一般都取得是第一个元素
2.两个哨兵值,一个从左边开始扫描的哨兵i和一个从右边开始扫描的哨兵j
3.当两个哨兵相遇的时候交换哨兵的值和基准值,完成一次循环的比较
4.相遇的值也就是基准值把该数组分成两个数组,一个全部小于基准值的数组,一个全部大于基准值的数组,也就是二分查找的思想。
5.两个数组重现开始排序,循环的递归和二分查找操作。
Java代码的实现:
public class QuickSortTest {
public void main (){
//定义一个数组
int[] arr = {23,984,263,9,18,47,56,2,34,23,11,14,78};
//定义一个排序的方法
quickSort(arr,0,arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
/**
* 快速排序算法
* @param arr
* @param low
* @param high
*/
private void quickSort(int[] arr, int low, int high) {
//校验数组只有一个元素时不比较
if (low >= high) {
return;
}
//1.定义基准值,哨兵值i哨兵j,交换值t
int temp = arr[low]; // 不能写死,循环递归用参数值
int i = low;
int j = high;
int t;
//2.开始从右边和左边开始扫描,右边小于的值和左边大于的数值进行交换处理,
while (i<j) { //前提条件是i<j的情况下比较
//从右边开始递减处理 大于基准值是正常的
while (temp <= arr[j] && i<j) {
j--;
}
//从左边开始递增 小于基准值是正常的
while (temp >= arr[i] && i < j) {
i++;
}
//两边都是不正常的情况下开始交换数值
if (i < j) { //保证大前提是i<j
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//3.前提条件i=j两个哨兵相遇之后,交换基准值和相遇值
arr[low] = arr[i];
arr[i] = temp;
//4.开始二分查找的循环递归,直到两边的数组排序完成
quickSort(arr,low,j-1);
quickSort(arr,j+1,high);
}
}
猜你喜欢
- 2024-11-10 时间复杂度 时间复杂度取决于
- 2024-11-10 选择排序代码及时间空间复杂度 简单选择排序时间复杂度分析
- 2024-11-10 排序算法汇总 排序算法 简书
- 2024-11-10 「时间管理」JavaScript算法时间、空间复杂度分析
- 2024-11-10 数据结构与算法——常见排序算法分享
- 2024-11-10 数据结构与算法-排序(八)计数排序(Counting Sort)
- 2024-11-10 上个厕所的功夫,就学会了“快速排序”算法
- 2024-11-10 常用排序方法使用场景和性能对比分析
- 2024-11-10 数据结构:复杂度分析(时间复杂度和空间复杂度)
- 2024-11-10 堆排序代码及时间空间复杂度 堆排序的算法及代码实现
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)