手写java快排(快速排序)代码——双边循环法,本人亲测哈哈!!

package com.abc.backend.algo;import java.util.Arrays;/*** 快排(双边循环法)*/
public class QuickSort {// 精髓在于,每一次传入的startIndex与endIndex都是基于递归中的“上一次”传进来的,而不是“最开始”的那两个值。public static void func(int[] nums, int startIndex, int endIndex){/** 结束条件 *//*关于 startIndex>endIndex 的情况简介 ——————一、说明递归的上一层中的"startIndex == pivotIndex == endIndex"。上一层中的“分治方法”中现象如下:(1)上一层中,因为startIndex == pivotIndex,所以startIndex > pivotIndex-1,而pivotIndex-1就是递归下一层的endIndex。  所以会导致startIndex>endIndex的情况(2)上一层中,因为  endIndex == pivotIndex,所以pivotIndex+1 > endIndex  ,而pivotIndex+1进入递归下一层的startIndex。所以会导致startIndex>endIndex的情况二、而startIndex == pivotIndex == endIndex时,说明nums中只剩一个数了,就应该终止执行递归了*/if(startIndex >= endIndex){ //注意这里是“ >= ”return;}int pivotIndex = funcExt(nums, startIndex, endIndex);/** 分治 */func(nums, startIndex, pivotIndex-1);func(nums, pivotIndex+1, endIndex);}public static int funcExt(int[] nums, int startIndex, int endIndex){//取基准数(第一个或者随机,这里取第一个)int pivot = nums[startIndex];int left = startIndex;// 换个词好理解int right = endIndex;//换个词好理解while (left != right){while(left != right &&  nums[right] > pivot){ // 循环挪指针过程中,首先保证left与right不相遇。如果相遇,则跳出循环,交换pivot与“重合数”right--;}while(left != right && nums[left] <= pivot){ // 循环挪指针过程中,首先保证left与right不相遇。如果相遇,则跳出循环,交换pivot与“重合数” // 这里有个等号,因为pivot与num[left]每轮开始时都相等left++;}/** right和left都停了,交换 *///{//    System.out.println("交换前数组:" + Arrays.toString(nums));//    System.out.println("交换前索引:[0][1][2][3][4][5][6][7]");//    System.out.println("交换索引位:" + left + "<<<>>>" + right);//}if(left != right){ // left与right相遇了,就不需要自己与自己交换了,浪费资源int t = nums[right];nums[right]=nums[left];nums[left]=t;}//{//    System.out.println("交换后数组:" + Arrays.toString(nums));//    System.out.println("==================");//}}/** right==left,即left与right相遇,相遇的位置叫“重合数”,交换pivot与“重合数” */nums[startIndex]=nums[left];nums[left]=pivot;return left;}public static void main(String[] args) {int[] nums = {4,7,3,5,6,2,8,1};// int[] nums = {8,1};QuickSort.func(nums, 0, nums.length-1);System.out.println(Arrays.toString(nums));}
}

算法——java快排(快速排序)相关推荐

  1. java快排原理_Java数据结构与算法——快速排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中最常用也是面试中最容易考到的排序算法--快排,包括快排的思 ...

  2. java快排算法解读,java 快排的思路与算法

    java 快排的思路与算法 有时候面试的时候的会问道Arrays.sort()是怎么实现的,我以前根本不知道是什么东西,最近点进去看了一下.直接吓傻, //看到这个时候还是比较淡定的,可怕的事情来了. ...

  3. 【数据结构与算法】快排、归并 O(nlogn) 基于比较

    冒泡.插入.选择 O(n^2) 基于比较 快排.归并 O(nlogn) 基于比较 计数.基数.桶 O(n) 不基于比较 一.分治思想 1.分治思想:分治,顾明思意,就是分而治之,将一个大问题分解成小的 ...

  4. java 快排_八大排序-快速排序(搞定面试之手写快排)

    概要 快速排序由C. A. R. Hoare在1960年提出,是八大排序算法中最常用的经典排序算法之一.其广泛应用的主要原因是高效,核心算法思想是分而治之.快速排序经常会被作为面试题进行考察,通常的考 ...

  5. Java快排算法详解

    快排算法底层基本思想: 先取出数列中的第一个数作为基准数. 将数列中比基准数大的数全部放在他的右边,比基准数小的数全部放在它的左边. 然后在对左右两部分重复第二步,直到各个区间只有一个数. 具体Jav ...

  6. 快排算法 java_快排算法的实现与讲解(java/C++)

    快排的算法其实不复杂,但是很少时候,偶尔整的自己头晕,所以写一篇博客,以免以后忘记. 假设我们的数组为:{5,2,1,8,9,3,7,0,4,6},一共10个数字,现在需要将这个数组进行排序.首先我们 ...

  7. java 快排和堆排序

    1.  这段时间准备找工作了,所以就从最简单的排序开始看看(以下是java实现的快速排序和堆排序): 注:快排和堆排序都是根据二叉树的原理来加快排序速度的... 快排: public static v ...

  8. 【数据结构算法】快排/归并/堆排序 c++

    一个用来了解数据结构算法(各种排序,列表,树等)很友好的网站: https://visualgo.net/en 该题目来自于牛客:算法篇-排序问题 快排(必备)+归并(体会分治)+堆(自己建堆) // ...

  9. python算法题排序_python-数据结构与算法- 面试常考排序算法题-快排-冒泡-堆排-二分-选择等...

    算法可视化网站推荐---->visualgo 0.面试题中的排序算法 一些排序算法可能在工作中用的会比较少,但是面试却是不得不面对的问题.算法有助于提高我们对数据结构的理解以及提高自己的逻辑能力 ...

最新文章

  1. Linux wc命令统计文件大小
  2. pytorch:多项式回归
  3. getResource(String name)用法及源码分析
  4. 加载更多时,判断tableView快要滑动到底部的时候在去请求更多数据的公式
  5. java中的过滤器:Filter
  6. 东北到底有没有互联网?!
  7. C++ Windows时间函数 QueryPerformanceCounter()与QueryPerformanceFrequency()
  8. gomod下导入模块的方法
  9. 常用图像处理相关图像数据库
  10. Matlab输出换行
  11. CSS 标签左右分布的多种方法
  12. word 格式的试题 转 问卷星excel格式
  13. BUAA 数据结构总结——大作业(文本摘要生成)
  14. 对刚装好系统的Linux配置软件开发生产环境,让你开发效率一飞冲天!
  15. 计算机无法识别移动硬盘怎么办,移动硬盘不能识别,教您移动硬盘不能识别怎么办...
  16. c# 获得本地ip地址的三种方法
  17. paddle 40 支持任意维度数据的梯度平衡机制GHM Loss的实现(支持ignore_index、class_weight,支持反向传播训练,支持多分类)
  18. [转帖]同事推荐的的aira2
  19. selenium实现拉钩爬虫
  20. 如何将迅雷设为默认下载器

热门文章

  1. 最新CSM会议室预约系统源码+功能强大
  2. 假期怎么玩,知道这几样轻松玩遍各地
  3. 正是江南好风景,落花时节又逢君。左右最值最大差
  4. pythonic code_pythonic code_Pythonic Code (Part II)
  5. 这个圣诞,为你的大佬疯狂打call
  6. 双联动listview
  7. 达芬奇五年沉浮—嵌入式处理器架构之争决战2012
  8. matlab查看支持向量数,支持向量机回归 MATLAB程序 参数设置(转)
  9. js中常用的打印输出语句
  10. Delphi 播放器[源码]