快速排序

  快速排序通过一个切分元素将数组分成两个子数组,左子数组小于等于切分元素,右子数组大于切分元素,将这两个子数组排序,也就是将整个数组排序了。

代码如下:

public class Sort{public static void quickSort(int []arr){if(arr=null||arr.length<2)return;quickSort(arr,0,arr.length-1);}public static void quickSort(int[]arr,int l,int r){if(l<r){swap(arr, l + (int) (Math.random() * (r - l + 1)), r); //随机选取切分值,然后交换到数组最后一位int []p=partition(arr,l,r);//返回于切分值相等的左右界quickSort(arr,l,p[0]-1);quickSort(arr,p[1]+1,r);}}public static int[]partition(int[]arr,int l,int r){int less=l-1; //小于区域的右边界int more=r;   //大于区域的左边界,初始包含最右端元素,即切分值。while(l<more){if(arr[l]<arr[r]){ //arr[r]作为切分值swap(arr,++less,l++); //如果当前元素小于切分值,那么将当前元素和小于区域的右边第一个元素和当前元素交换,小于区域向右扩大一位,访问下一个元素,继续进行比较。}else if(arr[l]>arr[r]){swap(arr,--more,l);//如果当前元素大于切分值,那么将当前元素和大于区域的左边第一个元素和当前元素交换,大于区域向左扩大一位,继续访问当前元素,进行比较。}else{ //和切分值相等l++;}}swap(arr,more,r); //将切分值换到中间return new int[]{less+1,more}; //与切分值相等的区间}public static void swap(int[]arr,int more,int r){arr[more]=arr[more]^arr[r];arr[r]=arr[more]^arr[r];arr[more]=arr[more]^arr[r];}
}

  快速排序是原地排序,不需要辅助数组,但是递归调用需要辅助栈。快速排序最好的情况下是每次都正好将数组对半分,这样递归调用次数才是最小的。这种情况下比较次数为Cn=2Cn/2+n,复杂度为O(NlogN)。

  最坏的情况是,第一次从最大的元素或最小的元素切分,第二次从第二大或者第二小的元素切分,如此这般,最坏情况下的比较次数为N * N /2。为了防止数组一开始就是有序的,我们在选择切分值是,进行随机选取。

  切分函数partition的应用,荷兰国旗问题,将数组分成三部分,分别对应于小于,等于,大于 切分元素。时间复杂度为O(n)。

public int[]partition(int []arr,int l,int r){int less=l-1; //小于区域的右边界int more=r;   //大于区域的左边界,初始包含最右端元素,即切分值。while(l<more){if(arr[l]<arr[r]){ //arr[r]作为切分值swap(arr,++less,l++); //如果当前元素小于切分值,那么将当前元素和小于区域的右边第一个元素和当前元素交换,小于区域向右扩大一位,访问下一个元素,继续进行比较。}else if(arr[l]>arr[r]){swap(arr,--more,l);//如果当前元素大于切分值,那么将当前元素和大于区域的左边第一个元素和当前元素交换,大于区域向左扩大一位,继续访问当前元素,进行比较。}else{ //和切分值相等l++;}}swap(arr,more,r); //将切分值换到中间return new int[]{less+1,more}; //与切分值相等的区间
}

转载于:https://www.cnblogs.com/yjxyy/p/11103372.html

排序---快速排序及其切分函数Partition应用相关推荐

  1. 快速排序(划分函数partition和主元pivot选取)

    快排是一种基于分治思想的排序算法,在如此众多的排序算法中,其综合排序速度最佳(大多情况为O(nlog2n)),这也是快排之所以叫快排的一个原因之一.先来看一下快排的基本轮廓. //快排函数static ...

  2. 分区函数Partition By的用法

    group by是分组函数,partition by是分区函数(像sum()等是聚合函数),注意区分. 1.over函数的写法: over(partition by cno order by degr ...

  3. 记录学习 - 分区函数Partition By的使用

    group by是分组函数.partition by是分区函数.sum()等是聚合函数 1.over函数的写法: over(partition by cno order by degree ) 先对c ...

  4. 分区函数Partition By的与row_number()的用法以及与排序rank()的用法详解(获取分组(分区)中前几条记录)...

    partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指 ...

  5. DS排序--快速排序

    题目 问题 C: DS排序--快速排序 时间限制: 1 Sec 内存限制: 128 MB 提交: 480 解决: 303 [提交][状态][讨论版] 题目描述 给出一个数据序列,使用快速排序算法进行从 ...

  6. 【啊哈!算法】算法3:最常用的排序——快速排序

    [啊哈!算法]算法3:最常用的排序--快速排序        上一节的冒泡排序可以说是我们学习第一个真正的排序算法,并且解决了桶排序浪费空间的问题,但在算法的执行效率上却牺牲了很多,它的时间复杂度达到 ...

  7. c++实现排序算法、swap函数的简单实现

    c++实现排序算法.swap函数的简单实现(代码只是大概意思不一定能运行) 冒泡排序 插入排序 希尔排序 堆排序 归并排序 快排 表排序 基数排序 swap函数实现 冒泡排序 void maopao_ ...

  8. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 抽象业务逻辑函数 )

    文章目录 一.二级指针排序 ( 抽象业务逻辑函数 ) 1.生成 二级指针 函数 2.打印 二维指针 函数 3.二维指针排序 函数 4.释放 二维指针 函数 二.完整代码示例 一.二级指针排序 ( 抽象 ...

  9. 编写一个C程序,实现以下功能:定义一个学生结构体Student(含学号、姓名、年龄、身高)和一个函数sort(struct Student *p),该函数使用选择排序法按年龄由小到大排序。在主函数中

    编写一个C程序,实现以下功能: 定义一个学生结构体Student(含学号.姓名.年龄.身高)和一个函数sort(struct Student *p),该函数使用选择排序法按年龄由小到大排序.在主函数中 ...

最新文章

  1. 深入讲解 ASP+ 验证
  2. 太扎心!人艰不拆!16 个程序员专属笑话讲给你听
  3. 现代密码学3.4--CPA安全,多次加密
  4. 循环: 打印1~10
  5. 3.定义一个有10个元素的数组,用其代表10个学生的考试成绩,从键盘输入10个成绩,统计平均成绩。
  6. 暑假集训考试反思+其它乱写
  7. 达摩院再获自动驾驶权威测评第一,车辆可识别“厘米级”障碍物
  8. CentOS下FastDFS+Nginx(单点部署)事例
  9. 散粉在哪个步骤用_无限回购的散粉
  10. Asp.Net Core 第03局:Startup
  11. 数字化时代,需要数据思维!
  12. Esri和IBM通过“代码集结号”全球挑战赛携手应对气候变化
  13. 5gh掌上云计算认证不通过_华为云计算认证含金量高么?
  14. 【实习】量化研究员-机器学习-Akuna Capital-美国金融交易公司
  15. python去除视频马赛克_python使用opencv实现马赛克效果示例
  16. Android AB系统ota更新
  17. flask 定时任务 flask-apscheduler
  18. 计算机图形学直线裁剪原理,计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪...
  19. 构造和析构函数调用顺序
  20. python编程:总结了一些高效使用 PyCharm 技巧,(三)

热门文章

  1. json 的简单应用
  2. 记一次OutOfMemory定位过程
  3. 获取手机当前显示的ViewController
  4. 201421410040 张运焘 实验一
  5. ASP.NET Core WebApi 返回统一格式参数
  6. js 宽窄屏切换效果代码优化
  7. ARX中的Purge
  8. vlc的应用之二:vlc的ActiveX及cab
  9. 解決 Tomcat 5.0.x % include file ... % 的中文亂碼問題
  10. leetcode算法题--两数相加 II