数组的运用、排序

 

问题描述                                                 

  在别人的博客上看到起面试经历中的面试题,自己也想实现下,说实话,这道题以前做数据结构的课程设计是做过的,而且这样的题,当时还问了同学的,可是没有自己想,没有上心,到现在也就影响不太深刻了,当时可能也没有很好地理解数组的使用。

给定一个整型数组,输入一个数字N时,要输出数组中第N大的数,并把它原来的下标输出来,要求用C语言实现,时间复杂度要求最小,20分钟时间。

代码                                                        

View Code
 1 #include<stdio.h>
 2 int main()
 3 {
 4    int a[10],b[10],temp,n;
 5    printf("请输入数组的长度\n");
 6    scanf("%d",&n);
 7    int i=0,j=0,count=0;
 8    printf("请输入整形数组的值\n");
 9    while(count<n){
10        b[count]=count;//记录数组原始的位置
11        //scanf("%d",&temp);
12       // a[b[count]]=temp;
13        scanf("%d",&a[b[count]]);
14        count++;
15    }
16    for(i=0;i<count;i++)
17        for(j=i+1;j<count;j++)
18        {
19            if(a[b[i]]>a[b[j]])
20            {
21                temp=b[i];
22                b[i]=b[j];
23                b[j]=temp;
24               temp=a[b[i]];
25               a[b[i]]=a[b[j]];
26               a[b[j]]=temp;
27            }
28        }
29        printf("要输出的N大数为:");
30        scanf("%d",&temp);
31        printf("最大值是:%d\n",a[temp]);
32        printf("原序列为:%d",b[temp]);
33    return 0;
34 }

总结                                                        
    加深印象,不过还没有实现其时间复杂度最小的要求,排序的算法现在还不是很熟悉,不过会看到的,到时再来改进一下这个题的解法。

最后作者还说 面试官问了不用辅助空间怎么实现。 也就是说不允许定义一个存放下标的数组。

刚一出Intel大门,突然想到了解决不用辅助空间的方法,唉~反应太迟钝了,第一次遍历下数组,知道了数组最大元素。INT类型的是4个字节,一般整数不会完全用完,可以用4个字节的前2个字节存放它们的下标(前提是这个数小于2^16),这样每次冒泡时,比较它们的低16位就行了,同时下标也跟着元素的交换走了。

这个我不是很懂,怎样让前两个字节存放它们的下标,然后再比较低16位。

  今天懂了怎么让前两个字节存放它们的下标,再比较低16位的做法了,代码如下:

View Code
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int a[10];
 5     int i=0,n,t,k=0;
 6     printf("请输入数组大小:\n");
 7     scanf("%d",&n);
 8     while(i<n){
 9         scanf("%d",&a[i]);
10          a[i]=a[i]+(i<<16);
11         i++;
12     }
13     for(int j=0;j<n;j++)
14         for(int h=j+1;h<n;h++)
15         {
16           if((short)a[j]>(short)a[h])
17           {   
18               t=a[j];
19               a[j]=a[h];
20               a[h]=t;
21           }
22         }
23         while(k<n){
24         printf("%d\t %d\n",(short)a[k],(a[k]>>16));
25         k++;
26     }
27 }

 

posted @ 2013-04-27 15:04  wj704  阅读(199)  评论(0编辑  收藏  举报