对于给定的n个元素的数组a[1..n] 要求从中找出第k小的元素,输出这个元素 pascal

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于给定的n个元素的数组a[1..n] 要求从中找出第k小的元素,输出这个元素 pascal相关的知识,希望对你有一定的参考价值。

program findnum;
var i,n,k:integer;
a:array[1..1000]of integer;
function template(left,right:integer):integer;
var temp,i,j,x:integer;
begin
i:=left;j:=right;
while j>i do
begin
while a[i]<=a[j] do
j:=j-1;
begin temp:=a[i];a[i]:=a[j];a[j]:=temp;end;

while a[j]>=a[i] do
i:=i+1;
begin temp:=a[i];a[i]:=a[j];a[j]:=temp;end;

end;
template:=j;
end;
procedure select(left,right,k:integer);
var temp,s:integer;
begin
s:=right-left+1;
if (k>n) or (k<1) then exit;
temp:=template(left,right);
if k=temp then begin writeln(a[temp]);exit;end;
if k>temp then select(temp+1,right,k-temp)
else select(left,temp-1,k);
end;
begin
readln(n,k);
for i:=1 to n do
read(a[i]);
select(1,n,k);
end.

这是我的程序,在
10 5
9 8 2 21 35 42 56 12 98 10
这个数据时输出35,正确答案应该是12,求高手帮忙改一下啊

绝对正确。。 选我最佳吧亲。。
var
i,j,k,n,right,temp,left:integer;
a:array[0..1000]of integer;
function template(left,right:integer):integer;
var
temp,i,j:integer;
begin
i:=left;j:=right;
while (j>i) do
begin
while (a[i]<a[j]) and (j>i) do
j:=j-1;
if (j>i) then begin temp:=a[i];a[i]:=a[j];a[j]:=temp;i:=i+1;end;
while (a[i]<a[j]) and (j>i) do
i:=i+1;
if (j>i) then begin temp:=a[i];a[i]:=a[j];a[j]:=temp;j:=j-1;end;
end;
template:=j-left+1;
end;

procedure select(left,right,k:integer);
begin
n:=right-left+1;
if (k>n) or (k<1) then begin writeln('error'); halt;end
else
begin
temp:=template(left,right);
if k=temp then begin writeln(a[temp+left-1]); exit;end
else begin
if k>temp then select(temp+left,right,k-temp)
else select(left,temp+left-2,k);
end;
end;
end;

begin
assign(input,'number.in');
assign(output,'number.out');
reset(input);
rewrite(output);
readln(n,k);
for i:=1 to n do
read(a[i]);
select(1,n,k);
close(input);
close(output);
end.
参考技术A 看我的,很简单吧。这样就免去了排序。我定义的数组,是储存最小的几个数的。FreePascal、Turbo Pascal7通过。
program ex(input,output);
var a:array [1..1000] of integer;i,j,p,n,m,x:integer;
begin
readln(n,m);
for i:=1 to m do a[i]:=32767;
for i:=1 to n do
begin
read(x);
for j:=1 to m do
if x<a[j] then
begin
for p:=m downto j+1 do a[p]:=a[p-1];
a[j]:=x;
break;
end;
end;
readln;
readln;
writeln(a[m]);
readln;
end.

选我做最佳答案!

参考资料:我的大脑

【C语言】查找:给定有10个元素的整数数组,输入一个数,在数组中查找是该数

查找:给定有10个元素的整数数组,输入一个数,在数组中查找是该数
要求
如果找到,输出该数在数组中的位置
如果数组中有多个数等于查找关键字,试给予不同的处理
若数组为排序的(升序或降序),试改为折半查找法

求解啊。。感激不尽!

参考技术A #include <stdio.h>
#define COMMON 0
#define MUL_EQU 1
#define ORDER 2
#define INC 1
#define DEC 2
int main()
int array[10];
int i,n,type,index,found=0,order;
printf("Input 10 integers:");
for(i=0;i<10;i++)
scanf("%d",&n);
array[i]=n;

printf("Input array type.\n \"0\" for Common\n \"1\" for 2 or more equal numbers\n \"2\" for ordered array\n:");
scanf("%d",&type);
switch(type)
case COMMON:
printf("Input index to search:");
scanf("%d",&index);
for(i=0;i<10;i++)
if(array[i]==index)
printf("Found at array[%d].\n",i);
return 0;


printf("Index not found!\n");
return 0;
case MUL_EQU:
printf("Input index to search:");
scanf("%d",&index);
for(i=0;i<10;i++)
if(array[i]==index)
printf("Found at array[%d].\n",i);
found=1;


if(found==0) printf("Index not found!\n");
return 0;
case ORDER:
if(array[0]<array[1])
order=INC;
else
order=DEC;

printf("Input index to search:");
scanf("%d",&index);
if(index==array[5])
printf("Found at array[5]\n");
return 0;
else if(index>array[5])
for(i=6;i<10;i++)
if(array[i]==index)
printf("Found at array[%d]\n",i);
return 0;


printf("Index not found!\n");
return 0;
else if(index<array[5])
for(i=0;i<5;i++)
if(array[i]==index)
printf("Found at array[%d]\n",i);
return 0;


printf("Index not found!\n");
return 0;


return 0;

需要注释吗?追问

如果有注释当然最好了~还有。..怎么运行啊?不好意思啊菜鸟一只

追答

我发现有个错误,把后半部分改掉了。不好意思,解答还这个样子⋯⋯
另外运行的话TC2啦WinTC啦应该都可以。大概吧⋯⋯(笑)因为我不清楚Windows的C,我用linux的GCC调试通过了,不过我没有Windows,没法试验,就只好麻烦你自己试一下了⋯⋯
加注释后百度说我超字数⋯⋯怎么办⋯⋯

本回答被提问者采纳

以上是关于对于给定的n个元素的数组a[1..n] 要求从中找出第k小的元素,输出这个元素 pascal的主要内容,如果未能解决你的问题,请参考以下文章

*数组题型汇总

二维数组找鞍点

第k小数1

美丽数列

【C语言】查找:给定有10个元素的整数数组,输入一个数,在数组中查找是该数

众数问题:给定含有n各元素的多重集合S,每个元素在S中出现次数成为重数。多重集S中重数最大的元素成为众