回忆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次递归 ...
随机推荐
- activiti学习第二天
今天我们来发布一个流程,然后查看数据库中都发生了什么变化. 下面我们使用activiti designer设计一个流程.如图 流程很简单,我们先简单后增加难度. 创建流程图的顺序,新建一个文件夹(di ...
- IIS 集成模式 导致 AjaxPro 无法正常运行
web.config 配置如下: system.web/httphandlers <httpHandlers> <add verb="POST,GET" path ...
- vs2015 加载项目的时启动:无法启动 IIS Express Web 服务器
使用Visual Studio 2015 运行ASP.NET项目时,提示“无法启动IIS Express Web服务器”,无法运行,如图: 一般出现在重装系统之后,或者项目是从别的电脑上复制过来的.解 ...
- 1、minimum-depth-of-binary-tree
题目描述 Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the ...
- python3学习笔记四(列表1)
参考http://www.runoob.com/python3/python3-list.html 序列 python包含6种内建的序列:列表,元组,字符串,Unicode字符串,buffer对象和x ...
- 采用ddt 可以把ddt获取的数据 塞进测试用例里面的备注里面去展示 (还没有试)
- Android - 简单listview
//MainActivity.java package com.example.zc.listviewdemo; import android.support.v7.app.AppCompatActi ...
- Inception-v3的设计思路小结
一.网络更深.更宽带来的问题 参数太多,若训练数据集有限,容易过拟合: 网络越大计算复杂度越大,难以应用:(内存和计算资源) 网络越深,梯度越往后穿越容易消失,难以优化模型. 解决: 如何减少参数(且 ...
- 使用睿云智合开源 Breeze 工具部署 Kubernetes v1.12.3 高可用集群
一.Breeze简介 Breeze 项目是深圳睿云智合所开源的Kubernetes 图形化部署工具,大大简化了Kubernetes 部署的步骤,其最大亮点在于支持全离线环境的部署,且不需要FQ获取 G ...
- vue+窗格切换+田字+dicom显示_02
环境:vue+webpack+cornerstone ide:vs code 需求:窗格设置+拼图设置 分析: 由于时间的原因,我也没有Baidu更好的显示窗格的方法,所以使用比较笨的方法,通过组件显 ...