快速排序
来源:互联网 发布:计算机编程难不难 编辑:程序博客网 时间:2024/05/29 12:13
数据结构课程上讲过的,今天终于有机会实现啦。
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int N = 1e6 + 5;int a[N];void quick_sort(int l,int r){if(l >= r)return ;int magic = rand() % (r - l) + l + 1;swap(a[l],a[magic]);int i = l, j = r;while(true){while(i < j && a[j] >= a[i])j--;if(i == j)break;swap(a[i++],a[j]);while(i < j && a[i] <= a[j])i++;if(i == j)break;swap(a[i],a[j--]);}quick_sort(l,i-1);quick_sort(j+1,r);}int main(){int n;while(~scanf("%d",&n)){for(int i=0;i<n;i++)scanf("%d",&a[i]);quick_sort(0,n-1);for(int i=0;i<n;i++)printf("%d ",a[i]);puts("");}return 0;}
扩展:找第K大元素。复杂度O(n),不需要对整个数组进行排序。
发现 STL 有实现,叫 nth_element(),复杂度 O(n)。
template <class RandomAccessIterator> void nth_element (RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
template <class RandomAccessIterator, class Compare> void nth_element (RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
再扩展一个叫 partial_sort(),保留前K大,复杂度 O(n * log k)。
template <class RandomAccessIterator> void partial_sort (RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
template <class RandomAccessIterator, class Compare> void partial_sort (RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int N = 1e4 + 5;int a[N];int quick_select(int l,int r,int k){int magic = rand() % (r - l) + l + 1;swap(a[l],a[magic]);int i = l, j = r;while(true){while(i < j && a[j] >= a[i])j--;if(i == j)break;swap(a[i++],a[j]);while(i < j && a[i] <= a[j])i++;if(i == j)break;swap(a[i],a[j--]);}if(k == i - l + 1)return a[i];else if(k < i - l + 1)return quick_select(l,i-1,k);elsereturn quick_select(j+1,r,k-(i-l+1));}int main(){int n,k;while(~scanf("%d%d",&n,&k)){for(int i=0;i<n;i++)scanf("%d",&a[i]);printf("%d\n",quick_select(0,n-1,n+1-k));}return 0;}
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 第三周作业
- 服务器状态监测 Keepalived
- 民间75个不传之密 ,医院都不知道的秘密
- Errors in file : ORA-27091: unable to queue I/O
- Matlab的regionprops详解
- 快速排序
- 记录下was的打包命令
- 黑马程序员 C#序列化和反序列化简介
- Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
- myBatis中$和#区别
- Machine learning in 10 pictures
- 数据挖掘 算法小结 1
- 证书登陆问题
- Dalvik、JVM学习笔记