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

排序详解之快速排序

快速排序

 

快速排序使用分治的思想,以某个数为分割点,每一趟排序下来,左边数都比它小,右边数都比它大,然后再对左右两边数组做递归操作。

时间复杂度(平均情况)n*lg(n)

 

排序步骤:

1.      以左边首元素为分割点,拿出来存在midElement里(这时候左边首位置空了

2.      从右边找比midElement小的数,放在刚才左边空的位置,就是首位(这时,右边有一个位置空了

3.      从左边找比midElement大的数,放在右边空的位置

4.      循环执行,直到左边索引>=右边索引

5.      midElement放在当前左索引处

6.      midElement为分割点,递归执行左半部分和右半部分

 

假设这样一组数:

5,8,1,3,7,9,2

 

快速排序的过程:

Step1 : 把首元素放入midElement变量中

 

 

 

 

 


第二步:

从右边找比MidElement小的,放左边空白位置,从左边找比midElement大的,放右边空白位置,直到leftIndex>=rightIndex

 

 

 

 

 

 


                                                                                                                                                 

 

 

 

 

 

 

 

 

 

 

   


第一趟快速排序完成了,可以发现5左边的数都比5小,5右边的数都比它大。然后的步骤就是以5,左边元素为一组,右边元素为一组,做同样的事情,在此就不逐步演示了。

 

参考代码:

public List<int> QuickSort(List<int> arr)
        {
            var right= arr.Count-1;
           Quick_Sort(arr,0,right);
            returnarr;
        }
    
        public voidQuick_Sort(List<int> arr, int left, int right)
        {
            if (left>= right) return;
 
           
            var refNum= arr[left];
            var low =left;
            var high =right;
 
            while (low< high)
            {
                while(low < high && arr[high] >= refNum)
                   high--;
                if(low < high)
                   arr[low++] = arr[high];
 
                while(low < high && arr[low] < refNum)
                   low++;
                if(low < high)
                   arr[high--] = arr[low];
            }
            arr[low] =refNum;
 
           Quick_Sort(arr,left,right - 1);
           Quick_Sort(arr,left + 1,right);
        }




相信你现在已经明白快速排序了,感谢您的阅读!

 

相关文章:

  • 价差100元 性能相当 蓝宝HD4830白金版 PK 9800GT显卡
  • 软件周周侃
  • 新的威胁!智能手机将成为黑客的下一个目标
  • 无资无本如何赚钱?——当一名“淘客”走上网络打工之路
  • Asp.net Design Pattern study notes -- PART 2
  • 利用Excel巧制抽奖器
  • XnView调整图片不失真
  • 物尽其才 用PotPlayer免费转录高清电影
  • 一句话技巧
  • How to use Interface
  • 无需第三方软件 用ScreenToaster在线进行视频录制
  • 将你的收藏共享给QQ好友
  • 你不在线,文件我照样传
  • 轻松发送语音邮件
  • linux下C编程详解
  • .pyc 想到的一些问题
  • 2017前端实习生面试总结
  • Asm.js的简单介绍
  • ES6系列(二)变量的解构赋值
  • Flannel解读
  • Java反射-动态类加载和重新加载
  • java取消线程实例
  • JS数组方法汇总
  • OSS Web直传 (文件图片)
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • spring cloud gateway 源码解析(4)跨域问题处理
  • SQLServer之索引简介
  • 给第三方使用接口的 URL 签名实现
  • 工作中总结前端开发流程--vue项目
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 理清楚Vue的结构
  • 前端面试之CSS3新特性
  • 如何用vue打造一个移动端音乐播放器
  • 微信小程序设置上一页数据
  • 阿里云移动端播放器高级功能介绍
  • 大数据全解:定义、价值及挑战
  • ​configparser --- 配置文件解析器​
  • ​虚拟化系列介绍(十)
  • # include “ “ 和 # include < >两者的区别
  • #pragma once与条件编译
  • #stm32驱动外设模块总结w5500模块
  • (1)(1.11) SiK Radio v2(一)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2022 CVPR) Unbiased Teacher v2
  • (27)4.8 习题课
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (六)激光线扫描-三维重建
  • (篇九)MySQL常用内置函数
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)shell中括号的特殊用法 linux if多条件判断