当前位置: 首页 > news >正文

Just for fun——迅速写完快速排序

快速排序

快速排序的话,应用了分治的思想,选取一个中间值,把小于它的值放左边,大于它的值放右边,然后再对这两个分组应用同样的方法,递归下去。

挖坑

挖坑是自己快速回忆实现这个算法的形象叫法。
如果现在有数组

[-1, 2, 4, 7, 8, -7, 6, 20]

clipboard.png

挖出第一个位置的值,存起来,现在有一个空的坑位了,需要填上

clipboard.png

刚开始的时候,i指向初始的位置,j指向末尾的位置,现在i指向的地方有坑位,j开始往前走,遇到的数如果比中间值(这里是-1)小的话,把当前j指向位置的数挖掉,给i上的位置填补上,现在j的位置是空的

clipboard.png

那现在i(+1之后)开始活动了,向前跑,如果碰到i指向位置的值比中间值(这里是-1)大,则把当前i指向位置的数挖掉,给j的位置补上,然后重复j运动的过程

clipboard.png

以上过程最终i和j会相遇(跳出循环点),那里正好有个空的坑位给中间值

clipboard.png

然后应用分治策略,对剩下的两个分组使用同样的手段

实现

Java实现

/**
  * 快速排序
  * @param arr int[] 排序数组
  * @param start int 开始位置
  * @param end int 结尾位置
  */
private static void quickSort(int[] arr, int start, int end) {
    if(end - start == 1) {
        if(arr[start] > arr[end]) {
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
        }
    } else if (end - start > 1) {
        int middle = arr[start];
        int i = start;
        int j = end;
        while (i != j && i <= end && j >= start) {
            while (arr[j] >= middle && j > i) {
                j--;
            }
            if(j > i) {
                arr[i] = arr[j];
                i++;
            }
            while (arr[i] <= middle && i < j) {
                i++;
            }
            if(i < j) {
                arr[j] = arr[i];
                j--;
            }
        }
        arr[i] = middle;
        quickSort(arr, start, i - 1);
        quickSort(arr, i + 1, end);
    }
}

Javascript的实现

let arr = [2, -1, -2, 100, 5];

function quickSort(arr, start, end) {
    if(end - start === 1) {
        if(arr[start] > arr[end]) {
            let temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
        }
    } else if (end - start > 1) {
        let middle = arr[start];
        let i = start;
        let j = end;
        while (i !== j && i <= end && j >= start) {
            while (arr[j] >= middle && j > i) {
                j--;
            }
            if(j > i) {
                arr[i] = arr[j];
                i++;
            }
            while (arr[i] <= middle && i < j) {
                i++;
            }
            if(i < j) {
                arr[j] = arr[i];
                j--;
            }
        }
        arr[i] = middle;
        quickSort(arr, start, i - 1);
        quickSort(arr, i + 1, end);
    }
}

quickSort(arr, 0, arr.length - 1);
console.log(arr);

PHP的实现

<?php

$arr = [2, -1, -2, 100, 5];


function quickSort(&$arr, $start, $end) {
    if($end - $start === 1) {
        if($arr[$start] > $arr[$end]) {
            $temp = $arr[$start];
            $arr[$start] = $arr[$end];
            $arr[$end] = $temp;
        }
    } elseif ($end - $start > 1) {
        $middle = $arr[$start];
        $i = $start;
        $j = $end;
        while ($i !== $j && $i <= $end && $j >= $start) {
            while ($arr[$j] >= $middle && $j > $i) {
                $j--;
            }
            if($j > $i) {
                $arr[$i] = $arr[$j];
                $i++;
            }
            while ($arr[$i] <= $middle && $i < $j) {
                $i++;
            }
            if($i < $j) {
                $arr[$j] = $arr[$i];
                $j--;
            }
        }
        $arr[$i] = $middle;
        quickSort($arr, $start, $i - 1);
        quickSort($arr, $i + 1, $end);
    }
}

quickSort($arr, 0, count($arr) - 1);
print_r($arr);

相关文章:

  • 十六进制之间的转换(二进制、八进制、十六进制、十进制)
  • php7.1.1一键安装/配置文件简单优化
  • Office 365中管理员角色介绍-进阶篇
  • SQL Server-表表达式基础
  • Oracle 11g RAC 故障之--Instance 启动失败
  • Nginx基于用户名和密码的访问控制
  • VS2005和ASP.NET2.0中使用强类型数据
  • HTML 简介
  • 开机取消按Ctrl+Alt+Del键
  • Android录制视频报错setVideoSize called in a invalid state 1
  • android自动化测试中hierarchyviewer和uiautomatorviewer获取控件信息的方式比对(1)
  • android89 服务service
  • 阿里云服务器使用之一:搭建jsp服务器
  • 安装 virtualenv
  • 实例详解ISA防火墙策略元素:ISA2006系列之五
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • css属性的继承、初识值、计算值、当前值、应用值
  • HTTP中GET与POST的区别 99%的错误认识
  • js中的正则表达式入门
  • Logstash 参考指南(目录)
  • ng6--错误信息小结(持续更新)
  • Python打包系统简单入门
  • Webpack 4x 之路 ( 四 )
  • webpack+react项目初体验——记录我的webpack环境配置
  • 简单易用的leetcode开发测试工具(npm)
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 移动端 h5开发相关内容总结(三)
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #LLM入门|Prompt#3.3_存储_Memory
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (算法二)滑动窗口
  • (小白学Java)Java简介和基本配置
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (循环依赖问题)学习spring的第九天
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • **PHP二维数组遍历时同时赋值
  • .axf 转化 .bin文件 的方法
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET连接数据库方式
  • .net下简单快捷的数值高低位切换
  • .NET中 MVC 工厂模式浅析
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • /etc/shadow字段详解
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @Import注解详解
  • [20160902]rm -rf的惨案.txt
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [Android] Android ActivityManager