快速排序及快速选择问题

1. 快速排序

  1. 采取分治,通过找到一个中枢值,使得中枢值左边的数小于等于其值,右边大于其值。
  2. 递归求解问题
  3. 当每一个数被当做一次中枢值,这个数组已经有序
//挖坑填数+分治
//函数出口为l=r时
//把数组分成中枢两侧,采取两个指针,挖坑填数
void quickSort(int a[],int left,int right){int l=left,r=right,key=a[l];if(l<r){while(l<r){while(l<r && key<a[r])r--;a[l]=a[r];while(l<r && key>=a[l])l++;a[r]=a[l];}a[l]=key;quickSort(a,left,l-1);              //左边递归,重复上面找中枢步骤quickSort(a,l+1,right);             //右边递归,重复上面找中枢步骤}
}

2. 快速选择问题

快速选择问题。输入n个整数和一个正整数k(1≤k≤n),输出这些整数从小到大排序后的第k个(例如,k=1就是最小值)。n≤107。

在快速排序的基础上,只需要找到第k个作为中枢的值,即为有序数列的第k个数的数值

int quickSort1(int a[],int left,int right,int num){//快速选择问题。输入n个整数和一个正整数k(1≤k≤n),输出这些整数从小到大排序后的第k个//函数出口为 l==r==num  和快排有差别int l=left,r=right,key=a[l];if(l<r){while(l<r){while(l<r && key<a[r])r--;a[l]=a[r];while(l<r && key>=a[l])l++;a[r]=a[l];}a[l]=key;}if(num==l)                                          //此时出现要找的数组下标return key;if(num<l)return quickSort1(a,left,l-1,num);              //递归左区间求解   必须带return,否则函数没法一级一级返回elsereturn quickSort1(a,l+1,right,num);             //递归左区间求解   必须带return,否则函数没法一级一级返回
}

快速排序和快速问题完整代码

#include <iostream>
#include <cstring>
#include <time.h>
#include <stdlib.h>
#define N 10
using namespace std;
int quickSort1(int a[],int left,int right,int num){//快速选择问题。输入n个整数和一个正整数k(1≤k≤n),输出这些整数从小到大排序后的第k个//函数出口为 l==r==num  和快排有差别int l=left,r=right,key=a[l];if(l<r){while(l<r){while(l<r && key<a[r])r--;a[l]=a[r];while(l<r && key>=a[l])l++;a[r]=a[l];}a[l]=key;}if(num==l)return key;if(num<l)return quickSort1(a,left,l-1,num);              //递归左区间求解   必须带return,否则函数没法一级一级返回elsereturn quickSort1(a,l+1,right,num);             //递归左区间求解   必须带return,否则函数没法一级一级返回
}
void quickSort(int a[],int left,int right){int l=left,r=right,key=a[l];if(l<r){while(l<r){while(l<r && key<a[r])r--;a[l]=a[r];while(l<r && key>=a[l])l++;a[r]=a[l];}a[l]=key;quickSort(a,left,l-1);              //左边递归,重复上面找中枢步骤quickSort(a,l+1,right);             //右边递归,重复上面找中枢步骤}
}
int a[N];
int b[N];
int main(){unsigned seek=unsigned(time(NULL));srand(seek);cout<<"Array:"<<endl;for(int i=0;i<N;i++){a[i]=rand();cout<<a[i]<<"\t";}cout<<endl;memcpy(b,a,sizeof(a));quickSort(a,0,N-1);int pos=3;                                      //要查找数的位置cout<<"Result:"<<endl;for(int i=0;i<N;i++)cout<<a[i]<<"\t";int ans=quickSort1(b,0,N-1,pos-1);        cout<<endl<<"部分排序:"<<endl;                    //通过打印这个数组,验证O(n)复杂度,不是全部操作,只操作一部分for(int i=0;i<N;i++)cout<<b[i]<<"\t";cout<<endl<<endl<<"第 "<<pos<<" 个数是:"<<ans<<endl;return 0;
}

输出结果:

Array:
11973 4898 13514 6085 14958 17750 2789 2706 20714 19060
Result:
2706 2789 4898 6085 11973 13514 14958 17750 19060 20714
部分排序:
2706 2789 4898 6085 11973 17750 14958 13514 20714 19060

第 3 个数是:4898

转载于:https://www.cnblogs.com/TianyuSu/p/9382815.html

快速排序及快速选择问题相关推荐

  1. 快速排序和快速选择(quickSort and quickSelect)算法

    排序算法:快速排序(quicksort)递归与非递归算法 TopK问题:快速选择(quickSelect)算法 import java.util.*; import java.lang.*;publi ...

  2. 快速排序,快速选择排序,选择排序的区别

    选择排序是对整体序列进行排序 快速排序也是对整体序列进行排序 快速选择算法是快速在未排序的数组中寻找第k小/大的元素 快速选择算法和快速排序的思想是找基准点 , 在基准点左边的都比他小,然后在基准点右 ...

  3. 随机化快速排序+快速选择 复杂度证明+运行测试

    对于快速排序和快速选择我之前的文章已经有详细的说明,需要了解的同学可以移步 传送门:快速排序|快速选择(BFPTR) 所谓随机化其实就是选择枢纽的时候使用随机数选择而已,实现起来很简单.但是我们使用随 ...

  4. 归并排序【算法解析,代码模板】

    787. 归并排序 - AcWing题库 前面我们有对快速排序和快速选择进行讲解,他们的 平均时间复杂度 为 O(nlogn) 当然,也存在一个最坏的情况 最好的情况就是 所以,其实快速排序的时间复杂 ...

  5. ReviewForJob——快速排序(基于插入排序)+快速选择(快速排序变体)

    [0]README 0)本文旨在给出 快速排序 的 源码实现和源码分析(分析它的坑): 2)要知道 在 元素个数小于10的时候,快速排序不如插入排序:注意快速排序选取枢纽元 时 所使用的方法是 三数中 ...

  6. 【算法】快速选择算法 ( 数组中找第 K 大元素 )

    算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...

  7. 【Leetcode】大神总结的所有TopK问题模板(基于快速排序)

    基本思想 通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. 实现原理 整个数组找基准正确位置,所有元素比 ...

  8. 排序算法 —— 快速排序

    快速排序算法介绍 划分问题:把数组的各个元素重排后分成左右两个部分,使得左边任意元素都小于或等于右边任意元素. 递归求解:把左右两部分分别排序. 快速排序代码 #include <iostrea ...

  9. 算法选择_快速筛出topK的快速选择算法

    在之前Python系列当中,我们介绍了heapq这个库的用法,它可以在O(nlogn)的时间里筛选出前K大或者前K小的元素.今天我们一起来看一个可以更快实现选择的快速选择算法. 思维推导 在公布答案之 ...

  10. 快速排序查询第k个数

    给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数. 输入格式 第一行包含两个整数 n 和 k. 第二行包含 n 个整数(所有整数均在 1∼109 ...

最新文章

  1. HGOI20190808 省常中互测1
  2. windows系统下HMailServer免费邮件服务器简易搭建
  3. Mac的控制台命令无法使用command not found
  4. JAVA中文支持指南(Vera Yuanti)
  5. Uploadify 配置错误信息提示
  6. 开发选gRPC还是HTTP
  7. 小米八显示无服务器,二修小米8无服务案例
  8. Maven的下载及安装
  9. 编译原理实验二C语言实现,编译原理实验报告(c语言).pdf
  10. 用c语言编程质数和合数,《质数和合数》教学设计
  11. 计算机二级vf上机考试题库,计算机等级考试二级VF上机题库
  12. WinRAR 设置默认密码
  13. ASIC设计流程相关
  14. STC89C51系列 EEPROM测试程序 证明扇区512个字节的擦除
  15. 漏洞复现----11、GlassFish任意文件读取
  16. three.js开发全景视频播放器的现实方法
  17. netstat -i FLG含义
  18. npm系列:package.json
  19. pca降维python实例_主成分分析(Principal component analysis, PCA)例子–Python | 文艺数学君...
  20. 我在赶集网的两个月 (完整版)

热门文章

  1. 基于Flex的MapGIS web开发——Flex中显示矢量地图(控件)
  2. Win7下Tomcat7和Apache2.2集成
  3. Javascript 读cookie
  4. 我的缺点,(不断补充中...)
  5. UserCF、 KNN 和 TopK
  6. 【问答系统】QA问答系统(Question Answering)
  7. 【NLP基础】手把手带你fastText文本分类(附代码)
  8. 客户价值分析—RFM模型及变形
  9. 非递归归并排序详细分析
  10. Java中private修饰变量的继承问题