首页 > 编程语言 >18 -- 排序算法之快速排序

18 -- 排序算法之快速排序

时间:2022-10-02 00:45:00浏览次数:59  
标签:arr 递归 -- 18 int pivot 排序

 

 

 

 

 从中可以发现:每次以哪个数为基准,哪个数就能被放置在最终拍好顺序的正确位置,示意图中是以每组数中的最后一个数作为基准的,需要指出的是:基准的选择不是确定的,也就是说,我们可以选择任意一个数作为基准,但是这个基准的选择需要遵循一定的规则(如:该组数最后一个,第一个,中间的数...)

示例程序是以每组数中间的索引所代表的数作为索引:

 1 import java.util.Arrays;
 2 
 3 public class QuickSort {
 4 
 5     public static void main(String[] args) {
 6         int[] arr = {9,78,0,23,-567,70};
 7         quickSort(arr, 0, arr.length - 1);
 8         System.out.println(Arrays.toString(arr));
 9     }
10     
11     public static void quickSort(int[] arr,int left, int right) {
12         int l = left;
13         int r = right;
14         int tmp = 0;
15         //pivot中间值
16         int pivot = arr[(l+r)/2];
17         while(l < r) {
18             while(arr[l] < pivot) { //从pivot左边找到一个大于pivot的值
19                 l ++;
20             }
21             
22             while(arr[r] > pivot) { //从右边找到一个小于pivot的值
23                 r --;
24             }
25             
26             //如果l == r说明此时pivot已经待到了最终排好序的正确位置
27             if(l == r) {
28                 break;
29             }
30             
31             //交换
32             tmp = arr[l];
33             arr[l] = arr[r];
34             arr[r] = tmp;
35             
36             //左边已经排好序了
37             if (arr[l] == pivot) {
38                 r --;
39             }
40             //右边已经排好序了
41             if (arr[r] == pivot) {
42                 l ++;
43             }
44         }
45         
46         //防止栈溢出
47         if (l == r) {
48             l ++;
49             r --;
50         }
51         //向左递归
52         if (left < r) {
53             quickSort(arr, left, r);
54         }
55         //向右递归
56         if(right > l) {
57             quickSort(arr, l, right);
58         }
59     }    
60 
61 }

运行结果:

 

 顾名思义:快速排序是一种速度很快的排序方法,不过从程序中的递归可以看出:快排是一种以空间换取时间的排序方法,因为它使用了递归,众所周知的是递归是比较耗费栈空间的,每一次递归都是一次压栈。

标签:arr,递归,--,18,int,pivot,排序
From: https://www.cnblogs.com/yumengqifei/p/16660620.html

相关文章

  • Demo11_12 java流程控制01小总结
    packagecom.HuanXin.scanner;importjava.util.Scanner;publicclassDemo01_02{publicstaticvoidmain(String[]args){//hasNext()与next()Sca......
  • MongoDB & Mongoose
    ##MongoDB和Mongoose###mongoose建立一个MongoDBAtlas数据库并导入连接到它所需的软件包。将`mongodb@~3.6.0`和`mongoose@~5.4.0`添加到项目的`package.jso......
  • VS Code安装
    1.1安装启动官网下载: VisualStudioCode(所有下载)如果下载速度很慢,点击官网logo下方有一行“Versionxxxisnowavailable!xxx”的蓝字进入更新说明。日期(版本)的大字......
  • 实验4:开源控制器实践——OpenDaylight
    1.基础要求需要提交两张图,一是Mininet拓扑生成并连接控制器的结果,二是Mininet中ping测试截图,并体现个人信息,其余文字请勿赘述;1)扑生成并连接控制器的结果2)Mininet中h1p......
  • 卷积神经网络知识
    CNN感觉这个人的博客很懂1感知机2激活函数2.1激活函数实例2.2常用的激活函数优缺点3卷积核3.1卷积核是什么,为什么要用它,CNN里面的卷积核是训练得到的,同时学习......
  • LeetCode21 合并两个有序链表
    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 (注意给出的三个实例,第一次由于没有注意到另外两个实例,忘记考虑一......
  • 数据库基础,看完这篇就够了!
    转载请注明出处❤️作者:测试蔡坨坨原文链接:caituotuo.top/747a74ea.html你好,我是测试蔡坨坨。对于测试同学来说,除了知道测试基础知识外,还需要掌握一些测试基本技能,主要......
  • 112-16-HBase DQL(查询数据) 源码核心实现深度分析_ev
           ......
  • 乘风破浪,遇见未来新能源汽车(Electric Vehicle)之特斯拉2022 AI Day,从四足特斯拉向二
    特斯拉机器人还有很长的路要走,但这条路已经越走越快。今天,特斯拉的第二届AIDay终于正式召开了。AIDay是特斯拉的年度活动之一,其他的固定活动还包括BatteryDay、Auton......
  • Luogu P7503 「HMOI R1」文化课
    题传先想一个巨shaber的暴力DP:设\(f_{i}\)为对前\(i\)个人分段的最优解,则:\[f_{i}=\max_{0\lej<i}\{f_{j}+\operatorname{W}(j+1,i)\}\]其中:\[\operatorname{W......