快速排序及快速选择问题
快速排序及快速选择问题
1. 快速排序
- 采取分治,通过找到一个中枢值,使得中枢值左边的数小于等于其值,右边大于其值。
- 递归求解问题
- 当每一个数被当做一次中枢值,这个数组已经有序
//挖坑填数+分治
//函数出口为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
快速排序及快速选择问题相关推荐
- 快速排序和快速选择(quickSort and quickSelect)算法
排序算法:快速排序(quicksort)递归与非递归算法 TopK问题:快速选择(quickSelect)算法 import java.util.*; import java.lang.*;publi ...
- 快速排序,快速选择排序,选择排序的区别
选择排序是对整体序列进行排序 快速排序也是对整体序列进行排序 快速选择算法是快速在未排序的数组中寻找第k小/大的元素 快速选择算法和快速排序的思想是找基准点 , 在基准点左边的都比他小,然后在基准点右 ...
- 随机化快速排序+快速选择 复杂度证明+运行测试
对于快速排序和快速选择我之前的文章已经有详细的说明,需要了解的同学可以移步 传送门:快速排序|快速选择(BFPTR) 所谓随机化其实就是选择枢纽的时候使用随机数选择而已,实现起来很简单.但是我们使用随 ...
- 归并排序【算法解析,代码模板】
787. 归并排序 - AcWing题库 前面我们有对快速排序和快速选择进行讲解,他们的 平均时间复杂度 为 O(nlogn) 当然,也存在一个最坏的情况 最好的情况就是 所以,其实快速排序的时间复杂 ...
- ReviewForJob——快速排序(基于插入排序)+快速选择(快速排序变体)
[0]README 0)本文旨在给出 快速排序 的 源码实现和源码分析(分析它的坑): 2)要知道 在 元素个数小于10的时候,快速排序不如插入排序:注意快速排序选取枢纽元 时 所使用的方法是 三数中 ...
- 【算法】快速选择算法 ( 数组中找第 K 大元素 )
算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...
- 【Leetcode】大神总结的所有TopK问题模板(基于快速排序)
基本思想 通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. 实现原理 整个数组找基准正确位置,所有元素比 ...
- 排序算法 —— 快速排序
快速排序算法介绍 划分问题:把数组的各个元素重排后分成左右两个部分,使得左边任意元素都小于或等于右边任意元素. 递归求解:把左右两部分分别排序. 快速排序代码 #include <iostrea ...
- 算法选择_快速筛出topK的快速选择算法
在之前Python系列当中,我们介绍了heapq这个库的用法,它可以在O(nlogn)的时间里筛选出前K大或者前K小的元素.今天我们一起来看一个可以更快实现选择的快速选择算法. 思维推导 在公布答案之 ...
- 快速排序查询第k个数
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数. 输入格式 第一行包含两个整数 n 和 k. 第二行包含 n 个整数(所有整数均在 1∼109 ...
最新文章
- HGOI20190808 省常中互测1
- windows系统下HMailServer免费邮件服务器简易搭建
- Mac的控制台命令无法使用command not found
- JAVA中文支持指南(Vera Yuanti)
- Uploadify 配置错误信息提示
- 开发选gRPC还是HTTP
- 小米八显示无服务器,二修小米8无服务案例
- Maven的下载及安装
- 编译原理实验二C语言实现,编译原理实验报告(c语言).pdf
- 用c语言编程质数和合数,《质数和合数》教学设计
- 计算机二级vf上机考试题库,计算机等级考试二级VF上机题库
- WinRAR 设置默认密码
- ASIC设计流程相关
- STC89C51系列 EEPROM测试程序 证明扇区512个字节的擦除
- 漏洞复现----11、GlassFish任意文件读取
- three.js开发全景视频播放器的现实方法
- netstat -i FLG含义
- npm系列:package.json
- pca降维python实例_主成分分析(Principal component analysis, PCA)例子–Python | 文艺数学君...
- 我在赶集网的两个月 (完整版)