这一章我们学习了排序的基本概念以及多种排序算法,下图是我对排序算法的时间复杂度的汇总。
回顾学习内容时,这两篇博客对我帮助很大:
https://blog.csdn.net/m0_37962600/article/details/81475585?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159453005719725219962590%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159453005719725219962590&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v3~rank_ctr_v4-4-81475585.ecpm_v1_rank_ctr_v4&utm_term=%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95
https://blog.csdn.net/sx2448826571/article/details/80487531?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159453005719725219962590%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159453005719725219962590&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v3~rank_ctr_v4-5-80487531.ecpm_v1_rank_ctr_v4&utm_term=%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95
后者还有动画演示,推荐!
在算法学习中,我觉得最难想象的算法就是堆排序,但是博客中的算法描述还是较清晰的:
算法描述:若升序的话,就将堆调成一个大堆,若降序的话,就将堆调成一个小堆.从倒数第一个非叶子节点开始往根遍历,若当前节点的值都大于左右孩子,则不用动,若是小于,就将左右孩子当中最大的节点与当前节点交换,交换后就需要进行向下调整(因为交换会影响大堆结构).重复上述步骤,直到根节点为止.
还有就是对算法稳定性的理解也非常重要,排序算法的稳定性,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。
在做PTA实践题时,我本来是执着于用归并算法,但是却不知如何合理应用结构体数组,在参考网上的代码后,我学习到了STL中非常好用的sort函数,这篇博客详细介绍了sort函数:
https://blog.csdn.net/Architect_chaser/article/details/88322605
这篇博客贴出的代码也精炼高效,让我学到了许多方法:https://blog.csdn.net/xiang_6/article/details/78759565?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
代码如下:
#includeusing namespace std; typedef long long ll; const int maxn = 30000+7, INF = 0x7f7f7f7f; int T, n; struct node { string s; int sc, id, st, fst; }a[maxn]; bool cmp(node a, node b) { if(a.sc == b.sc) return a.s < b.s; return a.sc > b.sc; } int main() { scanf("%d", &T); int cnt = 0; for(int i = 1; i <= T; ++i) { scanf("%d", &n); string s; int x; for(int j = 0; j < n; ++j) { cin >> s >> x; a[cnt+j].s = s; a[cnt+j].sc = x; a[cnt+j].id = i; } sort(a+cnt, a+cnt+n, cmp); a[cnt].st = 1; for(int j = 1; j < n; ++j) { if(a[cnt+j].sc == a[cnt+j-1].sc) a[cnt+j].st = a[cnt+j-1].st; else a[cnt+j].st = j+1; } cnt += n; } sort(a, a+cnt, cmp); cout << cnt << endl; a[0].fst = 1; cout << a[0].s << " " << a[0].fst << " " << a[0].id << " " << a[0].st << endl; for(int i = 1; i < cnt; ++i) { if(a[i].sc == a[i-1].sc) a[i].fst = a[i-1].fst; else a[i].fst = i+1; cout << a[i].s << " " << a[i].fst << " " << a[i].id << " " << a[i].st << endl; } return 0; }
这个学期的内容就学完了,数据结构让我收获了许多,从上学期随意地打代码,到现在已经会在做准备工作时考虑空间、时间的问题,我学到的不仅仅是各种算法、结构,更重要的是这门课改变了我打代码的态度和习惯,让我打代码变得更加小心严谨,趁着期末复习重新回顾全书的机会,希望我能巩固好知识点,回忆起每一个小细节。