思路
一开始想到的就是快速排序
不过这里是选择最大的n个数字,不需要在n个数字中进行排序
所以只需要每次去划分出两个区域【大区域和小区域】的时候
去拿大区域的总数跟n比较大小,>n就就划分大区域,<n就划分小区域
注意:比较的时候记得+1【一开始划分的节点】
代码
class Program
{
static int Z_xiabiao= 0 ;
static int L_xiabiao= 0 ;
static void Main ( string [ ] args)
{
int [ ] number= { 23 , 777 , 3 , 56 , 1 , 445 , 43 , 85 , 544 , 67 , 86 } ;
int n= 5 ;
int s= 0 ;
int start= 0 ;
int end= number. Length- 1 ;
s= GetIndex ( number, start, end) ;
GetNum ( number, n, s+ 1 , start, end) ;
Console. Readkey ( ) ;
}
static void GetNum ( int [ ] number, int n, int currentnum, int start, int end)
{
Console. WriteLine ( ) ;
if ( currentnum== n)
{
return ;
}
else if ( currentnum> n)
{
Z_xiabiao++ ;
Console. WriteLine ( "左边节点第" + Z_xiabiao+ "次,当前的个数有:" + currentnum) ;
end= currentnum;
currentnum= GetIndex ( number, start, end) ;
GetNum ( number, n, currentnum+ 1 , start, end) ;
}
else if ( currentnum< n)
{
L_xiabiao++ ;
Console. WriteLine ( "右边节点第" + Z_xiabiao+ "次。当前的个数有:" + currentnum) ;
start= currentnum;
currentnum= GetIndex ( number, start, end) ;
GetNum ( number, n, currentnum+ 1 , start, end) ;
}
static int GetIndex ( int [ ] num, int start, int end)
{
int data= num[ start] ;
Swap ( num, start, end) ;
int pp= start;
for ( int i= start; i< end; i++ )
{
if ( num[ i] > data)
{
Swap ( num, i, pp) ;
pp++ ;
}
}
Swap ( num, end, pp) ;
return pp;
}
static void Swap ( int [ ] num, int x, int y)
{
int swap= num[ x] ;
num[ x] = num[ y] ;
num[ y] = swap;
}