一,如何判断计算机大小端模式?
/************************************************************************/
/* 小端是低字节放前
大端是高字节放前 */
/************************************************************************/
bool checkcpu()
{
union union_1
{
short int a;
char c;
}u;
u.a =1;
return (u.c ==1);//是小端
}
二,sizeof的主要用途
1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:
void *malloc(size_t size),
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
2、sizeof的另一个的主要用途是计算数组中元素的个数。例如:
void * memset(void * 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);
}