面试题总集合

本文介绍了面试中常见的技术问题,包括如何判断计算机的大小端模式,sizeof操作符的主要用途,以及如何从大量数据中快速找出最小(大)的固定数量的数,通过堆排序的方法实现。提供了具体的C语言代码示例。
摘要由CSDN通过智能技术生成

一,如何判断计算机大小端模式?

/************************************************************************/
/* 小端是低字节放前
   大端是高字节放前   */                                                                
/************************************************************************/
bool checkcpu()
{
 union union_1
 {
  short int a;
  char c;
 }u;
 u.a =1;
 
 return (u.c ==1);//是小端
}
二,sizeof的主要用途

1sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

  void *mallocsize_t size,

  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)

2sizeof的另一个的主要用途是计算数组中元素的个数。例如:

  void * memsetvoid * s,int c,sizeof(s))。

三,如何从10000个数里面取1000个最大(小)的数

采用堆排序思想。设数组有1万个数,先建立一个1000个数的小(大)顶堆。然后依次描扫后面的9000个数。如果比堆顶小(大),那么就跳过,否则代替掉堆顶,重新调整成为一个堆。

 

扫描完后堆里面的数就是所求的1000个数。

 

/**************************************************************************/
/*a[adj+1,n]是一个大顶堆,现在要加入a[adj]使得a[adj,n]使成为大顶堆        */
/**************************************************************************/
void adjustHeap(int a[],int adj, int n)
{
 
 //保留要调整的节点
 int value =a[adj];

 //adj_l 表示下一层左结点
 int adj_l =(adj+1) * 2 -1;      

    while(adj_l <= n)
 {
 
  if((adj_l +1 <=n) && (a[adj_l] < a[adj_l+1]))
  {
   adj_l += 1;//保留最大值的节点索引值
  }
        if ( value > a[adj_l])break;

  a[adj] = a[adj_l];
     adj = adj_l;
  adj_l= (adj_l+1) * 2 -1;
 
 }
 a[adj] = value;

}


void HeapSort(int a[],int n)
{

 int temp;
 for(int i=n/2-1;i>=0;i--)
  adjustHeap(a,i,n-1);

 for(int j=n-1;j>0;j--)
 {
 
      temp=a[j];
   a[j]=a[0];
   a[0]=temp;
 
   adjustHeap(a,0,j-1);
 }
}

void print(int a[],int n)
{
 printf("/n");
 for (int i=0;i<n;i++)
 {
  printf("%.4d ",a[i]);
 }
 printf("/n");
}


#define  TOTAL 10000
#define SUB 1000

 

void main()
{
    int i;

 int a[TOTAL];
   
 for (i =0;i<TOTAL;i++)
 {
  a[TOTAL-i-1]=i+1;
 }

 //建立了一个1000元素的大顶堆
 for( i=SUB/2-1; i>=0; i--)
  adjustHeap(a,i,SUB-1);
 print(a,SUB);
 for(i=SUB;i<TOTAL;i++)
 {
          if(a[i] < a[0])
    {
     a[0]= a[i];
     adjustHeap(a,0,SUB-1);
    }
   
 }
 print(a,SUB);
 
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值