一.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进行快排的更多相关文章

  1. Java实现的各种排序算法(包括冒泡,快排等)

    //堆排序 不稳定 import java.util.Arrays; public class HeapSort { public static void main(String[] args) { ...

  2. python之排序算法-冒泡、选排、快排

    影响内排序算法性能的三个因素: 时间复杂度:即时间性能,高效率的排序算法应该是具有尽可能少的关键字比较次数和记录的移动次数 空间复杂度:主要是执行算法所需要的辅助空间,越少越好. 算法复杂性.主要是指 ...

  3. iOS常见算法(二分法 冒泡 选择 快排)

    二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number)  { int start = 0; int end = l ...

  4. Java排序算法 [选择、冒泡、快排]

    选择排序: 简述:从数组的第一个元素开始,依次与其他所有的元素对比,如果比自身大或小(取决于升序或降序)交换位置. package com.sort; import java.util.Arrays; ...

  5. Partition算法剖析

    博文链接:http://haoyuanliu.github.io/2016/12/18/Partition%E7%AE%97%E6%B3%95%E5%89%96%E6%9E%90/ 对,我是来骗访问量 ...

  6. Partition算法以及其应用详解上(Golang实现)

    最近像在看闲书一样在看一本<啊哈!算法> 当时在amazon上面闲逛挑书,看到巨多人推荐这本算法书,说深入浅出简单易懂便买来阅读.实际上作者描述算法的能力的确令人佩服.就当复习常用算法吧. ...

  7. 荷兰国旗问题、快排以及BFPRT算法

    荷兰国旗问题 给定一个数组arr,和一个数num,请把小于num的数放数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边.要求额外空间复杂度O(1),时间复杂度O(N). 这个问题 ...

  8. 利用快排partition求前N小的元素

    求前k小的数,一般人的想法就是先排序,然后再遍历,但是题目只是求前N小,没有必要完全排序,所以可以想到部分排序,而能够部分排序的排序算法我能想到的就是堆排序和快排了. 第一种思路,局部堆排序. 首先, ...

  9. BFPRT 算法 (TOP-K 问题)——本质就是在利用分组中位数的中位数来找到较快排更合适的pivot元素

    先说快排最坏情况下的时间复杂度为n^2. 正常情况:   最坏的情况下,待排序的记录序列正序或逆序,每次划分只能得到一个比上一次划分少一个记录的子序列,(另一个子序列为空).此时,必须经过n-1次递归 ...

随机推荐

  1. php读取不到指定的php.ini配置

    新建启动脚本 启动时指定路径 解决方案一:修改  /etc/init.d/php-fpm 文件 1 # 在这行命令上添加 指定的配置路径 2 php_opts="--fpm-config $ ...

  2. 浅析rune数据类型

    学习golang基础的时候,发现有个叫rune的的数据类型,当时不理解这个类型的意义. 查询,官方的解释如下: // rune is an alias for int32 and is equival ...

  3. Hystrix 学习使用

    说明: 每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中 执行execute()/queue做同步或异步调用 请求接收后,会先看是否存在缓存数据,如果存在,则不会继续 ...

  4. nginx配置http强制跳转https

    nginx配置http强制跳转https 网站添加了https证书后,当http方式访问网站时就会报404错误,所以需要做http到https的强制跳转设置. 一.采用nginx的rewrite方法 ...

  5. [zz]蟑螂蚂蚁蚊子已不住在我家了!这个方法100%见效…

    http://mt.sohu.com/20150324/n410238511.shtml 蚂蚁怕酸,蚊子怕辣,蟑螂怕香.在下给各位提供一个不杀生又能驱赶蚂蚁.蚊子.蟑螂的妙法. 一.蚂蚁怕酸味 家里的 ...

  6. erlang遍历目录

    {ok, Cwd} = file:get_cwd(). Filelist = filelib:fold_files( Cwd, ".*", true, fun(File, Acc) ...

  7. 爬虫-day01-基础知识

    '''爬虫的构成下载器: 抓取页面 urllib equests selenium + webdriver解析器: 解释并提取页面元素 BeautifulSoup4 PyQuery Xpath Reg ...

  8. 【ELK】之Kibana使用

    GET _search { "query": { "match_all": {} } } GET _cat/indices GET elk- GET /elk- ...

  9. solr schema.xml Field属性详解

    <field name="id" type="string" indexed="true" stored="true&quo ...

  10. python函数-基础篇

    函数 为什么要用函数?1.减少代码冗余2.增加代码可读性 函数的定义及使用 def info(): # 这里我们定义一个打印个人信息的函数 name = "xiaoming" ag ...