荷兰国旗
来源:互联网 发布:阿里云 公网流量费用 编辑:程序博客网 时间:2024/06/10 05:02
首先是将数组整理成负数在前,正数在后
思想:一次快排,标杆选为第一个数,确定其最终位置即可
void negtive_front(int a[],int n){int temp=a[0];int i=0,j=n-1;while(i<j){while(a[j]>=0&&i<j){j--;}if(i<j){a[i]=a[j];while(a[i]<0&&i<j){i++;}if(i<j)a[j]=a[i];}if(i==j)a[i]=temp;}}
将数组整理成负数在前,0在中间,正数在后
思想:荷兰国旗问题,使用三个指针,一个指针i保证前面全是负数,一个指针p保证前面全是负数和零,一个指针j保证后面全是负数,在p遇到负数时,与i所指swap一下,i++,p++;遇到0,p++;遇到正数,与j所指swap一下,j--,p不动继续判断当前位置
void helan_flag(int a[],int n)//使所有的负数在前0在中间正数在后面,各部分内部可以无序{int i=0,j=n-1,p=0;while(p<=j)//p<j时 -1 0 3 -1 0不正确,因为b所指为0,p同指,应该与r交换。p走到b的左边才能保证后面的都是正数,不用再看了{if(a[p]==0)p++;else if(a[p]<0){swap(a[i],a[p]);p++;i++;}else if(a[p]>0){swap(a[p],a[j]);//p++;//这个不能++j--;}}}
分成四部分呢,同理,设4个指针
void four_part(int a[],int n){//eg分为{0},{一位数},{两位数},{三位数}int i=0,p=0,q=0,j=n-1;while(q<=j){if(a[q]==0){swap(a[i],a[q]);i++;p++;q++;}else if(a[q]<10){swap(a[p],a[q]);p++;q++;}else if(a[q]<100){q++;}else {swap(a[j],a[q]);j--;}}}
快排的思想求众数:将数组整理成三部分,前部分<标杆,中间等于标杆,后部分>标杆,然后判断哪部分的数超过半数,对其进行递归判断。
int find_half(int a[],int start,int end,int n){int little=start,middle=start,big=end;//小的放前面,大的放后面int temp=a[start];while(middle<=big){if(a[middle]<temp){swap(a[little],a[middle]);little++;middle++;}else if(a[middle]==temp){middle++;}else{swap(a[middle],a[big]);big--;}}//判断哪部分的数过半if((big-little+1)>n/2)return a[big];//中间的数据else if((little-start)>n/2)return find_half(a,start,little-1,n);else if((end-big)>n/2)return find_half(a,big+1,end,n);elsereturn -1;//没有这种数据时}
0 0
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗问题
- 荷兰国旗问题
- 【算法】荷兰国旗
- 荷兰国旗问题
- 荷兰国旗问题
- uva1484
- 利用底层键盘钩子屏蔽任意按键
- android之layout布局和ListView中的一些属性介绍
- Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
- C++9.3.8 赋值与swap
- 荷兰国旗
- OracleOraDb11g_home1TNSListener服务启动后自动停止
- python 使用scapy进行ARP扫描
- Linux内核Backlog笔记
- myeclipse如何切换用户
- jQuery checkbox“checked”返回 undefined
- 给字符数组赋值的方法
- leetcode--Rotate List
- libsqlite3.dylib与libsqlite3.0.dylib的区别