早教吧作业答案频道 -->数学-->
c读入n个不相同且不为0的数不用排序求出其中第r个大的数c读入n个不相同且不为0的数(1≤n≤100)不用排序求出其中第r个大的数(1≤r≤n)即有r-1个数比他大其余数比它小.
题目详情
c读入n个不相同且不为0的数 不用排序 求出其中第r个大的数
c读入n个不相同且不为0的数(1≤n≤100) 不用排序 求出其中第r个大的数(1≤r≤n) 即有r-1个数比他大 其余数比它小.
c读入n个不相同且不为0的数(1≤n≤100) 不用排序 求出其中第r个大的数(1≤r≤n) 即有r-1个数比他大 其余数比它小.
▼优质解答
答案和解析
求第K大的数,这是个很经典的题目,看到这个题目,很多人的第一反应就是:对这个
数组进行排序,然后直接去第k个数字就行了.的确,这是一个方法,不过是最笨的一个方
法,如果数据量很大的时候,光排序就占用了很多时间,而且楼主要求不能用排序,所以
得另辟蹊径!
对一组数据进行排序,最快的要数快排序了,其中快排序中最核心的partion函数就是确
定一个数的最终位置,这个位置前面部分的数要比这个数小,这个位置后面部分的数都比
这个数大,然后再对前后两个部分进行递归运算,最后就得出一个有序的数组.
在这里,我们就可以运用快排序的思想,直接求出第k个位置上的数
比如说,我们第一次调用partion函数,它返回一个索引index,如果index比k大,说明
应该在index的前面部分循环调用partion,如果比较小就在后面部分调用partion,知道最
后index正好等于k,这个k就是排序后的有序数组中的k,也就是第k大了,空口无凭,上代
码,并附有我运行调试的结果.
int partion(int a[],int left,int right)//此函数,是寻找一个数组元素在排序后的
最终位置
{
int temp=a[left];
while(left {
while(temp<=a[right]&&left --right;
a[left]=a[right];
while(temp>=a[left]&&left ++left;
a[right]=a[left];
}
a[left]=temp;
return left;
}
int FindKth(int a[],int n,int k)//寻找第k大,返回值就是需要找的k
{
int index;
index=partion(a,0,n-1);
while(index!=k)
{
if(index index=partion(a,index+1,n-1);
else
index=partion(a,0,index-1);
}
return index;
}
为了让楼主看的更明白,我把原始数据用快速排序法,排序后显示,此题可以不用.下面
是快速排序法:
void quicksort(int a[],int left ,int right)//快速排序
{
int index;
if(left {
index=partion(a,left,right);
quicksort(a,left,index-1);
quicksort(a,index+1,right);
}
}
void Quick_sort(int a[],int left,int right)//显示快速排序后的数组元素
{
quicksort(a,left,right);
cout< for(int i=0;i<=right;i++)
cout<}
数组进行排序,然后直接去第k个数字就行了.的确,这是一个方法,不过是最笨的一个方
法,如果数据量很大的时候,光排序就占用了很多时间,而且楼主要求不能用排序,所以
得另辟蹊径!
对一组数据进行排序,最快的要数快排序了,其中快排序中最核心的partion函数就是确
定一个数的最终位置,这个位置前面部分的数要比这个数小,这个位置后面部分的数都比
这个数大,然后再对前后两个部分进行递归运算,最后就得出一个有序的数组.
在这里,我们就可以运用快排序的思想,直接求出第k个位置上的数
比如说,我们第一次调用partion函数,它返回一个索引index,如果index比k大,说明
应该在index的前面部分循环调用partion,如果比较小就在后面部分调用partion,知道最
后index正好等于k,这个k就是排序后的有序数组中的k,也就是第k大了,空口无凭,上代
码,并附有我运行调试的结果.
int partion(int a[],int left,int right)//此函数,是寻找一个数组元素在排序后的
最终位置
{
int temp=a[left];
while(left
while(temp<=a[right]&&left
a[left]=a[right];
while(temp>=a[left]&&left
a[right]=a[left];
}
a[left]=temp;
return left;
}
int FindKth(int a[],int n,int k)//寻找第k大,返回值就是需要找的k
{
int index;
index=partion(a,0,n-1);
while(index!=k)
{
if(index
else
index=partion(a,0,index-1);
}
return index;
}
为了让楼主看的更明白,我把原始数据用快速排序法,排序后显示,此题可以不用.下面
是快速排序法:
void quicksort(int a[],int left ,int right)//快速排序
{
int index;
if(left
index=partion(a,left,right);
quicksort(a,left,index-1);
quicksort(a,index+1,right);
}
}
void Quick_sort(int a[],int left,int right)//显示快速排序后的数组元素
{
quicksort(a,left,right);
cout<
cout<}
看了c读入n个不相同且不为0的数不...的网友还看了以下:
验证乙烯与H2的加成反应的实验中将H2与乙烯同时同入水中再经过碱石灰,水有什么作用? 2020-04-25 …
将9个苹果放入大中小三个盘,大盘比中盘多4个,中盘比小盘多四个,怎么放拜托各位大神 2020-04-26 …
1.体积相同的铁块和铝块放入水中都沉底,它们收到的浮力一样大么?为什么?如果将铁块放入煤中,把铝块 2020-05-17 …
松松同学把一苹果放入水中,苹果在水中处于悬浮状态.松松从水中取出苹果,分成一个大块和一个小片再将小 2020-06-06 …
把一块橡皮泥捏成不同形状,沉水的和浮的哪个排开的水量大?泡沫塑料块在水中受到的浮力记录表小部分侵入 2020-06-22 …
从1950年到1957年,中国人的平均寿命从36岁延长到57岁.学龄儿童的入学率同期从25%增至5 2020-07-07 …
大盒放有若干支同样的钢笔,小盒放有若干支同样的圆珠笔,两盒笔的总价相等.如果从大盒取出8支钢笔放入 2020-07-08 …
往8个相同的透明玻璃瓶中灌入不同高度、不同颜色的水,用同样大小的力敲击时可发出...(2013•佛山 2020-11-12 …
从1950年到1957年,中国人的平均寿命从36岁延长到57岁。学龄儿童的入学率同期从25%增至50 2020-11-15 …
从文化生活的角度.谈谈你对加强两岸共同光大中华文化的认识 2020-11-25 …