c - 如何在合并排序和插入排序之间进行选择?
问题描述
我需要实现最快的排序算法来对使用标准输入创建的链表进行排序。
我知道合并排序的时间复杂度是 O(n logn) 而插入排序的时间复杂度是 O(n^2) (是链表中元素的数量)。
但是列表是由标准输入创建的,所以在未排序的列表上使用合并排序更有效还是通过插入排序创建列表更有效,这意味着在输入上对列表进行排序?
这是结构:
#define SIZE 50
struct node {
int num;
char name[SIZE];
struct node* next;
};
这些是排序标准:
1. Sorted alphabetically by "name".
2. When the name is the same it's sorted by "num" (from higher to lower).
解决方案
事实上,插入排序是一种在线算法,而合并排序是一种离线算法。然而:
并非每个离线算法都有有效的在线算法。
这也是这里的情况。
当数据已经部分排序时,您应该更喜欢插入排序而不是合并排序,因为前者是一种自适应算法。
注意:对于小型输入,插入排序也是首选。
推荐阅读
- python - 按给定条件提取 numpy 行
- json - 无法在 Yii2 api 中返回 json 响应
- java - 如何将输入作为字符串转换为存储在单独类中的整数?
- css - 滑块行高 CSS
- javascript - nodejs的io中的io.sockets.adapter.rooms在哪里?
- python - 简单的python脚本,多线程?
- node.js - Hyperledger Fabric v2.1:网关连接选项中 asLocalhost 设置为 false 的 Fabcar
- sql - 将日期时间与另一个表 date_time 进行比较
- node.js - 如何在猫鼬的集合中找到文档项的平均值?
- python - CSS 静态文件在 Django 中不起作用,我是 Django 的初学者,main.css 属性没有应用于我的 store.html