从一个数组中同时找出最大最小数-算法导论第九章
2017-10-11 22:22
288 查看
(1)首先,从一个数组中找出一个最大或最小值,只需要遍历一次,进行n-1次比较就可以得到
(2)同时取出最大最小值呢,同时意味着只经过一次遍历
实际上,至多只需要3*n/2次就可以了
可以将元素按对来处理,先比较每一对的大小,再把大的和最大值比较,小的和最小值比较。
分奇偶:
奇数个:把最大和最小值都先设为第一个值
偶数个:把最大和最小分别设为前两个数。
实际上就是要保证剩下来比较的是偶数个
在线性时间内求出数组a中的第i小(或大)的元素,以小为例:
平均情况下:时间复杂度为o(n),最差就是每一次余下的元素都是按最大的划分出来的,则是o(n^2)
*取第5小
0 8 5 2 4 6 3 19 23 20
第一次划分
Start=0,end =9;
得到q=0;,划分后数组
8 5 2 4 6 3 19 23 20
划分的结果是从a[1]=8开始,这时候应该是取第4小,所以在比较时候就必须q-(现在的)start+1***
for(int i=0;i<array.length;i++){ if(min>array[i]){ min=array[i]; }
(2)同时取出最大最小值呢,同时意味着只经过一次遍历
实际上,至多只需要3*n/2次就可以了
可以将元素按对来处理,先比较每一对的大小,再把大的和最大值比较,小的和最小值比较。
分奇偶:
奇数个:把最大和最小值都先设为第一个值
偶数个:把最大和最小分别设为前两个数。
实际上就是要保证剩下来比较的是偶数个
public void getMax_Min(int a[]){ int len=a.length; int max=0,min=0; int i=0,j=len-1; if(len%2==0){ if(a[0]>a[1]) { max=a[0]; min=a[1]; } else{ max=a[1]; min=a[0]; } i=2;//索引从2开始 } else{ max=a[0]; min=a[0]; i=1; } while(i<j){ if(a[i]<a[j]){ max=a[j]>max?a[j]:max; min=a[i]<min?a[i]:min; } else{ max=a[i]>max?a[i]:max; min=a[j]<min?a[j]:min; } i++; j--; } System.out.println(max+" "+min); }
在线性时间内求出数组a中的第i小(或大)的元素,以小为例:
public int getRandom_select(int a[],int start,int end,int i){ if(start==end){ return a[start]; } int q=Partition(a,start,end); //System.out.println("q"+q+"start"+start+"i"+i); if((q-start+1)==i){//这里必须要进行q-start+1,不能直接是q,因为i,是变化的,但q是一直是0——a.length最初的索引来算的,所以当是k<i这种情况时候直接用q就是偏大的,看下面粗体 //System.out.println("q"+q+" "+i); return a[q]; } int k=q-start+1;//表示的是从start到q总共多少元素 if(k>i) return getRandom_select(a,start,q-1,i); else { return getRandom_select(a,q+1,end,i-k); } } int Partition(int a[],int left,int right)//快速排序的划分,得到枢轴量的下标 { int i=left; int j=right; int temp=a[left]; System.out.println("temp"+temp); while(i<j) { while(i<j && a[j]>=temp) j--; if(i<j) a[i++]=a[j]; while(i<j && a[i]<=temp) i++; if(i<j) a[j--]=a[i]; } a[i]=temp; return i; }
平均情况下:时间复杂度为o(n),最差就是每一次余下的元素都是按最大的划分出来的,则是o(n^2)
*取第5小
0 8 5 2 4 6 3 19 23 20
第一次划分
Start=0,end =9;
得到q=0;,划分后数组
8 5 2 4 6 3 19 23 20
划分的结果是从a[1]=8开始,这时候应该是取第4小,所以在比较时候就必须q-(现在的)start+1***
相关文章推荐
- 【算法导论】同时找出最大值和最小值
- 【算法导论】同时求数组的最大值和最小值
- 从一个数组中找出第k小元素的随机化算法 c语言实现 算法导论第九章
- 算法8:一个整数数组里怎么同时找最大和最小的数,尽量优化比较次数
- 同时找出在数组中的最大值、最小值
- 死磕==同时找出数组中得最大值和最小值
- 同时找出数组的最大值和最小值
- 同时找出数组的最大值和最小值,要求时间复杂度为o(n)
- hunter学算法-从一个数组中找到和最大的子数组,数组中可能有负数。
- 算法导论9.1 最大值和最小值
- 二叉排序树中,令f = (最大值+最小值) / 2,设计一个算法, 找出距离f值最近、大于f值的结点。复杂度不能为O(n2)。
- 小sugar呀____最大子数组问题(算法导论)
- 算法数据结构C++实现7 - 同时查找最大值和最小值优化算法
- ios 数组最大值,最小值,平均值,和的快速算法
- 算法导论第五章实例伪码转C++_最大子数组
- [原]Java面试题-输入一个整型数组,找出最大值、最小值,并交换。
- 实验9(1)程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- 【算法】(遇到的问题)给定一个数组,找出不在数组中的最小的那个数字
- 同时找数组里的最大最小数——分治思想
- 通过随机数生成办法,向int num[10][10]的数组 中存入数据并找出数组的最大、最小值及其下标。