数据结构第八章学习小结

几种常见排序方法的时间复杂度及空间复杂度:

 

这周的作业:

判断题基本上都是关于各种排序的时间复杂度及排序方法是否稳定的问题,看着上面这张图就可以答了,不是特别难。

选择题

下列排序算法中,哪种算法可能出现:在最后一趟开始之前,所有的元素都不在其最终的位置上?(设待排元素个数N>2)

(2分)
A.

冒泡排序

B.

插入排序

C.

堆排序

D.

快速排序

解析:选B,C貌似对,但是被忘记审题.是“所有”,堆最后一次排序必是针对根节点,其影响只是左树或右树,不是所有.而B有可能使得所有已经排序的元素进行一次位移.(最后一个元素是最小的)

编程题:

第一题:统计工龄不算特别难,可以设置一个大小为50的数组,每输入一个人的工龄,将数组下标等于工龄的值加一,最后输出数组中不为0的项就ok了;

具体代码:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int N;
 7     cin >> N;
 8     int i;
 9     int m;
10     int a[51]={0};
11     for(i=0; i<N; i++)
12     {
13         cin >> m;
14         a[m]++;    
15     }
16     
17     for(i=0;i<=50;i++)
18     {
19         if(a[i]!=0)  cout << i << ":" << a[i] <<endl;    
20     }    
21     
22     return 0;
23 }

第二题:PAT排名汇总

这道题会难很多,要考虑两个考场的人放在一起后的排名,我的想法是定义一个结构体,记录他在原来考场的排名,合并后的排名,考点的编号,结构体的定义如下:

1 typedef struct Stu{
2     string id;   //学号
3     int score;   //分数
4     int allRank;   //合并后的排名
5     int placeRank;   //在原来考场的排名
6     int placeId;   //考场的编号
7 }Stu;

对考生的分数进行排序,我的方法是一个挨着一个比较,返回分数高的

1 bool cmp(Stu a,Stu b)
2 {
3     if (a.score!=b.score)  return a.score>b.score;
4     else  return a.id<b.id;
5 }

我的做法是先将各个考场内的人先进行排序,再将所有考场的人进行排序,sort函数我选择了库里自带的,时间复杂度为O(log2n),比所有编出来的sort函数都要小一些,代码如下:

 1 int main()
 2 {
 3     int n;
 4     cin>>n;
 5     int num = 0;
 6     int k;
 7     for(int i = 0;i<n;i++)
 8     {
 9         cin>>k;
10         for(int j = num;j<num+k;j++)
11         {
12             cin >> stu[j].id >> stu[j].score;
13             stu[j].placeId = i+1;
14         }
15         sort(stu+num,stu+num+k,cmp);      //处理每一个考场的排名问题
16         int level = 1;
17         for(int j = num;j<num+k;j++)       //注意考虑重分的人
18         {
19             if(j==num)
20                 stu[j].placeRank = level;
21             else
22             {
23                 if(stu[j].score==stu[j-1].score)
24                     stu[j].placeRank = stu[j-1].placeRank;
25                 else stu[j].placeRank = level;
26             }
27             level++;
28         }
29         num+=k;                       //注意num要加k
30     }
31     sort(stu,stu+num,cmp);
32     int level = 1;
33     for(int j = 0;j<num;j++)       //注意考虑重分的人
34     {
35         if(j==0)
36             stu[j].allRank = level;
37         else
38         {
39             if(stu[j].score==stu[j-1].score)
40                 stu[j].allRank = stu[j-1].allRank;
41             else stu[j].allRank = level;
42         }
43         level++;
44     }
45     cout<<num<<endl;
46     for(int i = 0;i<num;i++)
47     {
48         cout<<stu[i].id<<" "<<stu[i].allRank<<" "<<stu[i].placeId<<" "<<stu[i].placeRank<<endl;
49     }
50     return 0;
51 } 

这学期真的特别快,不知不觉就到期末了,这一学期下来,对数据结构也越来越喜欢了,刚开始觉得特别难,后来前面的只是学懂之后,后面的学起来也简单了很多,要到期末了,下星期就想着把以前做过的选择判断主观题都看一遍,打过的代码也复习一遍,最重要的是要多看看书,书上的知识点讲的特别细,很适合复习,加油!!!

posted @ 2020-07-12 11:34  徐志涵  阅读(179)  评论(0编辑  收藏  举报