快速排序一次排序的应用
来源:互联网 发布:淘宝纳米碳溶胶 编辑:程序博客网 时间:2024/06/06 04:59
1.将数组中的大写字母与小写字母分开
例子:一个数组中存储有且仅有大写和小写字母,编写一个函数对数组内的字母重新排列,让小写字母在大写字母之前
#include<iostream>#include<string>using namespace std;//判断是否为大写字母 bool isUpper(char a){if(a>='A' && a<='Z')return true;return false;} //判断是否为小写字母bool isLower(char a){if(a>='a' && a<='z')return true;return false;} void partition(string &str, int low, int high){while(low<high){while(low<high && isUpper(str[high])) high--;while(low<high && isLower(str[low])) low++;char temp=str[high];str[high]=str[low];str[low]=temp;}}int main(){string str;cin>>str;int len=str.length();partition(str,0,len-1);for(int i=0; i<len; i++)cout<<str[i]<<" ";return 0;}
2.给定含有n个元素的整型数组a,其中包括0元素和非0元素,对数组进行排序,
要求:
排序后所有0元素在前,所有非0元素在后,且非0元素排序前后相对位置不变;
不能使用额外的空间
例如:
输入:0 3 0 2 1 0 0
输出:0 0 0 0 3 2 1
#include<iostream>using namespace std;void partition(int a[],int low, int high){int i=high+1;for(int j=high; j>=low; j--){if(a[j]!=0){i--;int temp=a[i];a[i]=a[j];a[j]=temp;}}}int main(){int a[7]={0,3,0,2,1,0,0};partition(a,0,6);for(int i=0; i<7;i++){cout<<a[i]<<" ";}return 0;}
3.进阶-荷兰国旗问题
将乱序的红白蓝三色小球排列成同颜色在一起的小球组(按照红白蓝排序),这个问题成为荷兰国旗问题。这是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗,如下面所示,0表示红球,2表示蓝球,1表示白球
这个问题类似于快排中partition过程。不过,要用指针,一前begin,一中current,以后end,begin与current都初始化指向数组首部,end指向数组尾部。
1).current遍历整个数组序列,current指向1时,不交换,current++
2).current指向0时,与begin交换,而后current++,begin++
3).current指向2时,与end交换,而后currentcurrent不动,end--
#include<iostream>using namespace std;void partition(int *num, int n){int begin=0,current=0,end=n-1;while(current<=end){if(num[current]==0){int temp=num[current];num[current]=num[begin];num[begin]=temp;current++;begin++;}else if(num[current]==1)current++;else{int temp=num[current];num[current]=num[end];num[end]=temp;end--;}}} int main(){int num[10]={0,1,2,1,1,2,0,2,1,0};partition(num,10);for(int i=0;i<10;i++){cout<<num[i]<<" ";}return 0;}4.最小的k个数
#include<iostream>using namespace std;int Partition(int *num,int low,int high){ int pivot=num[low]; while(low<high){ while(low<high && num[high]>=pivot) high--; num[low]=num[high]; while(low<high && num[low]<=pivot) low++; num[high]=num[low]; } num[low]=pivot; return low; } void getLeastKNum(int *input, int n,int k){if(input == NULL || k>n || n<=0 || k<=0)return;int start=0;int end=n-1;int index = Partition(input,start,end);while(index !=k-1){if(index >(k-1)){end=index-1;index=Partition(input,start,end);}else{start=index+1;index=Partition(input,start,end);}}for(int i=0; i<k; i++){cout<<input[i]<<" ";}}int main(){int input[8]={8,231,2,24,5,34,12,9};getLeastKNum(input,8,5);return 0;}
1 0
- 快速排序一次排序的应用
- 快速排序的应用
- 快速排序的应用
- 记一次快速排序算法的调试
- 一次快速排序错误引发的思考
- 快速排序 一次遍历partition的实现
- 快速排序算法的应用
- 算法:记一次快速排序
- 快速排序-应用
- 快速排序简单应用
- 快速排序 及应用
- 快速排序及其应用
- 快速排序法应用
- 快速排序的原理及实际应用
- 快速排序算法在生活中的应用
- C++中qsort快速排序的应用
- 快速排序的实现与应用
- 不是快速排序的排序
- Android .不一样的辅助服务,打开一个全新视角
- FZU 2150 Fire Game 枚举BFS
- MFC中listControl控件右键双击响应事件
- Python3中替代Python2中cmp()函数的新函数(gt,ge,eq,le,lt)
- JS学习笔记-CSS篇(一)
- 快速排序一次排序的应用
- bzoj1012(线段树或单调队列)
- 蒙特·卡罗方法-转
- JP1.1
- kei文件在用word打开时中文是乱码的解决办法
- ORA-08103 错误解决
- NOIP 2015 D2 T2 子串 substring
- hdu1024 Max Sum Plus Plus
- Longest Palindromic Substring_Leetcode_#5