回忆Partition算法及利用Partition进行快排
一.Partiton算法
Partiton算法的主要内容就是随机选出一个数,将这个数作为中间数,将大于它的排在它右边,小于的排在左边(无序的)。
int partition (int arr[],int start,int end) //传入一个数组和要进行partition的范围
{ int pivot = arr[start]; // 将第一个数做为中间数 while( start < end ){ while (start<end&&arr[end]>=pivot) //从右边开始寻找,找到第一个小于中间数的数
end--;
arr[start]=arr[end];//找到后往最左边的位置放
while (start<end&&arr[start]<=pivot) //同理,从最左边开始寻找,找到第一个大于中间数的数,往右边放
start++;
arr[end]=arr[start];//因为end的位置是之前第n个比中间数小的数,并且已经放在了靠左的位置,所以此时可以将比中间数大的数往end填
}
arr[start]=pivot;
return start; //返回中间值的下标
}
二.利用Partition进行快排
基本原理就是把某个范围一直缩小并且一直Partition.
为了直观直接拿出一个数组进行排序。(可直接运行观察结果)
#include<bits/stdc++.h>
using namespace std;
int num[]={,,,,,,,,};
int partition (int arr[],int start,int end) //[start,end]
{
int pivot = arr[start];
while( start < end ){
while (start<end&&arr[end]>=pivot)
end--;
arr[start]=arr[end];
while (start<end&&arr[start]<=pivot)
start++;
arr[end]=arr[start];
}
arr[start]=pivot;
return start;
}
void sort(int arr[],int l,int r){ //将[l,r]范围内进行排序
int mid = partition(num,l,r); //在该范围进行一次partition,得到中间值的下标mid,可知此时mid对应的数以左的数比它小,以右的数比它大
if(mid>l)sort(arr,l,mid-); //[l---mid--------------------r] 当mid大于范围的最小下标时,将[l,mid-1]范围内进行一次partition
if(mid<r)sort(arr,mid+,r); //同理,当mid小于范围的最大下标时,将[mid+1,r]范围内进行一次partition
} //分到最后每个数的左边的数都比它本身小,右边的数都比它本身的大,也就完成了从小到大的排序。
int main ( int argc, const char * argv[])
{
sort(num,,);
for(int i=;i<;i++)
cout<<num[i]<<" ";
return ;
}
为了防止忘记写下这篇博客,毕竟partition算法是很常用的一种算法,并且不止一种方法,目前就只记这种比较好理解的了。
回忆Partition算法及利用Partition进行快排的更多相关文章
- Java实现的各种排序算法(包括冒泡,快排等)
//堆排序 不稳定 import java.util.Arrays; public class HeapSort { public static void main(String[] args) { ...
- python之排序算法-冒泡、选排、快排
影响内排序算法性能的三个因素: 时间复杂度:即时间性能,高效率的排序算法应该是具有尽可能少的关键字比较次数和记录的移动次数 空间复杂度:主要是执行算法所需要的辅助空间,越少越好. 算法复杂性.主要是指 ...
- iOS常见算法(二分法 冒泡 选择 快排)
二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number) { int start = 0; int end = l ...
- Java排序算法 [选择、冒泡、快排]
选择排序: 简述:从数组的第一个元素开始,依次与其他所有的元素对比,如果比自身大或小(取决于升序或降序)交换位置. package com.sort; import java.util.Arrays; ...
- Partition算法剖析
博文链接:http://haoyuanliu.github.io/2016/12/18/Partition%E7%AE%97%E6%B3%95%E5%89%96%E6%9E%90/ 对,我是来骗访问量 ...
- Partition算法以及其应用详解上(Golang实现)
最近像在看闲书一样在看一本<啊哈!算法> 当时在amazon上面闲逛挑书,看到巨多人推荐这本算法书,说深入浅出简单易懂便买来阅读.实际上作者描述算法的能力的确令人佩服.就当复习常用算法吧. ...
- 荷兰国旗问题、快排以及BFPRT算法
荷兰国旗问题 给定一个数组arr,和一个数num,请把小于num的数放数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边.要求额外空间复杂度O(1),时间复杂度O(N). 这个问题 ...
- 利用快排partition求前N小的元素
求前k小的数,一般人的想法就是先排序,然后再遍历,但是题目只是求前N小,没有必要完全排序,所以可以想到部分排序,而能够部分排序的排序算法我能想到的就是堆排序和快排了. 第一种思路,局部堆排序. 首先, ...
- BFPRT 算法 (TOP-K 问题)——本质就是在利用分组中位数的中位数来找到较快排更合适的pivot元素
先说快排最坏情况下的时间复杂度为n^2. 正常情况: 最坏的情况下,待排序的记录序列正序或逆序,每次划分只能得到一个比上一次划分少一个记录的子序列,(另一个子序列为空).此时,必须经过n-1次递归 ...
随机推荐
- linux的基本操作2
/dev/ha[a-d] IDE硬盘(过时了)/dev/sd[a-p] U盘,scsi,sata,ssd硬盘(流行)/dev/cdrom 光盘 CD-ROM/dev/mouse 鼠标 fdisk ...
- js正则表达式讲的最好的
https://www.cnblogs.com/chenmeng0818/p/6370819.html
- 访问器 & 修改器
访问器 model /** * 定义一个访问器 当 Eloquent 尝试获取 title 的值时,将会自动调用此访问器(查詢時自動調用) * @author jackie <2019.02.1 ...
- 2.4 Visio2007显示动态对齐网格
- Unix/Linux进程间通信
一,Linux下进程间通信的几种主要手段简介: 1,管道(Pipe)及有名管道(named pipe) 管道可用于具有亲缘关系进程间的通信 有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功 ...
- python之路——10
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 a.函数可读性强,复用性强 def 函数名() 函数体 return 返回值 函数先定义后执行, b. ...
- centos7 安装percona-toolkit工具包的安装和使用
一.检查和安装与Perl相关的模块 PT工具是使用Perl语言编写和执行的,所以需要系统中有Perl环境. 依赖包检查命令为: rpm -qa perl-DBI perl-DBD-MySQL perl ...
- SAS LOGISTIC 逻辑回归中加(EVENT='1')和不加(EVENT='1')区别
区别在于:最大似然估计分析中估计是刚好正负对调加上EVENT:%LET DVVAR = Y;%LET LOGIT_IN = S.T3;%LET LOGIT_MODEL = S.Model_Params ...
- Jobs深入学习
代码回顾 Quartz 需要了解你可能希望该作业的实例拥有的各种属性,这是通过JobDetail 类完成的. JobDetail 实例是使用 JobBuilder 类构建的. JobDetail j ...
- Learn the Basics - RN2
使用Image 1. 引用 import { Image } from 'react-native'; 2. 使用 format: <Image source={{}} style{{}} /& ...