分类
标签
.NET 9008 adb android apt asp.net ASP.NET Core audio bug C c++ C++ chrome cmd csharp CSharp css css3 debian debug dotnet dotnet Framework dpkg GDI&GDI+ gdi&gdi+ golang graphics html html5 http java javascript json kali linux linux mci microsoft minimap MSBuild mysql OpenCV PInvoke powershell python QQ rust shell speex sql tutorial ubuntu ui unity vb.net visual studio Visual Studio web Web win32 winapi windows winform WinForm wpf WPF xaml xfce 列表 刷机 前端 加密 反射 反编译 可视化 图像处理 多线程 字符串 安卓 实例 局域网 幻影坦克 库 开发语言 异步 微信 手册 手机 接口 摘要 救砖 数字签名 数字证书 数字音频 数据库 桌面程序 游戏 游戏引擎 源码 爬虫 玩游戏 电脑硬件 笔记 算法 类库 线性代数 编程语言 网络 脚本语言 计算机图形学 计算机基础 设计模式 语音编解码 运维 进制 面向对象编程 音频 音频编码解码
890 字
4 分钟
排序算法: 超高速根据字符串长度排序的算法
1. 你需要知道这些:
代码适用于:
- 适用于字符串数组的元素长度变化量较小的, 比如字符串的长度普遍在1~2000, 那么此时, 这个算法将有超高的性能, 测试结果是 10万条数据排序所需时间为91ms(你没看错).
应用场景:
- 你有一个超级长的文本文件, 这里面每一行都是一条数据, 例如这些数据是用爬虫获取的搜索关键字, 你现在需要将它们排序, 别犹豫, 我认为这个算法非常适合你.
局限性
- 字符串数组的元素长度变化量越大, 该算法效率可能会越低,因为里面包含了对字符串长度变化量排序的过程,这个过程是使用的选择排序法。(选择排序法的所需时间与数据长度不成正比,不多赘述)
2.算法的主要内容
主要原理:
- 定义一个字典, 键是int, 值是可变的字符串列表, 定义一个可变的字符串列表作为存储结果的容器
- 循环源字符串数组, 将一切可能的长度作为int, 一个新的字符串列表作为值, 添加到上面所说的字典里面
- 第二次循环源字符串数组, 将迭代到的字符串的长度作为键, 在字典中键所对应的字符串列表中添加这个字符串
- 排序字典的键, 循环排序后的所有键, 将键对应的字符串列表的每一个字符串添加到结果中
- 排序结束
示例代码:
// 这是C#代码
// Dictionary 与 List 位于 System.Collections.Generic 命名空间下
string[] StringSort(string[] source)
{
int[] sortKeys(int[] src) // 这里是用于排序字典的键的
{
int most;
int mostIndex = 0;
int temp;
if (src.Length > 1)
{
for (int i = 1; i < src.Length; i++)
{
most = src[i];
for (int j = i; j < src.Length; j++)
{
if (src[j] < most)
{
most = src[j];
mostIndex = j;
}
}
if (most < src[i - 1])
{
src[mostIndex] = src[i - 1];
src[i - 1] = most;
}
}
}
return src;
}
Dictionary<int, List<string>> firstSortedString = new Dictionary<int, List<string>>();
List<string> result = new List<string>();
foreach (string i in source)
{
if (!firstSortedString.ContainsKey(i.Length))
{
firstSortedString.Add(i.Length, new List<string>());
}
}
foreach (string i in source)
{
firstSortedString[i.Length].Add(i);
}
foreach (int i in sortKeys(firstSortedString.Keys.ToArray()))
{
foreach (string j in firstSortedString[i])
{
result.Add(j);
}
}
return result.ToArray();
}
}
End
1. 这个算法只是偶然间想到的, 不喜勿喷, 也请多多指教.
2. 算法作为一个功能嵌入到我的一个文本处理小工具中
- (对文本文件的每一行进行特定处理), 这个工具包含以下功能
- ‘在行首行末随机插入特定的内容’,
- ‘在行首行末依照自己定义好的一个字符串序列,按顺序一个个插入到行首或行末’,
- ‘以一定初值,一定增量, 在行首或行末插入数字’,
- ‘根据每一行的字符串长度排序’
- ‘根据每一行的字符串内容排序’
- ‘去除功能(去除空行,去除重复行, 去除行首行末指定字符,去除包含关键字的行 等等)’ … … … . .
想恰饭 (;´༎ຶД༎ຶ`)
- 上面所说的小工具是帮人代写的, 如果你需要它并且懒得写代码, 我很乐意将他出售给你. 之前没有排序功能的时候, 原售价是50¥ (老板给了这么多)
- 欲购买的话… 私聊就好 (虽然这的确是一个没有什么技术含量的东西)
排序算法: 超高速根据字符串长度排序的算法
https://slimenull.com/posts/20200626020405/