C# 中最优雅的 shell 排序(梳状/递减增量排序)方式是什么?
有没有更好的方法使用 C# 进行希尔排序?
// array of integers to hold values
private int[] a = new int[100];
// number of elements in array
private int count;
// Shell Sort Algorithm
public void sortArray()
{
int i, j, increment, temp;
increment = 3;
while( increment > 0 )
{
for( i=0; i < count; i++ )
{
j = i;
temp = a[i];
while( (j >= increment) && (a[j-increment] > temp) )
{
a[j] = a[j - increment];
j = j - increment;
}
a[j] = temp;
}
if( increment/2 != 0 )
{
increment = increment/2;
}
else if( increment == 1 )
{
increment = 0;
}
else
{
increment = 1;
}
}
}
顺便说一句,我想知道,因为我有一些不同语言中“优雅”排序的不同示例(例如 C# 和 F#),我正在比较它们。在现实生活中,我可能大部分时间都会在 C# 中使用以下模式:
Array.Sort( object[] )
我不在乎这些模式是否是“学术”和非实用模式。如果你愿意的话,你可以将我修改为遗忘:)
KA
Is there a better way to shell sort using C#?
// array of integers to hold values
private int[] a = new int[100];
// number of elements in array
private int count;
// Shell Sort Algorithm
public void sortArray()
{
int i, j, increment, temp;
increment = 3;
while( increment > 0 )
{
for( i=0; i < count; i++ )
{
j = i;
temp = a[i];
while( (j >= increment) && (a[j-increment] > temp) )
{
a[j] = a[j - increment];
j = j - increment;
}
a[j] = temp;
}
if( increment/2 != 0 )
{
increment = increment/2;
}
else if( increment == 1 )
{
increment = 0;
}
else
{
increment = 1;
}
}
}
By the way, I'm wondering because I have some different examples of 'elegant' sorts in different languages (like bubble sorting in C# and F#), and I'm comparing them. In real life, I'd probably use the following most of the time in C#:
Array.Sort( object[] )
I don't care if these are 'academic' and non-pragmatic patterns. You can down-mod me into oblivion if you want :)
KA
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以很容易地进行改进:
ShellSort
而不是shellSort
count
而不是x
使用条件运算符,例如
使代码通用 - 为什么将自己限制为整数?
IList
IComparer
任意排序,提供使用默认值的重载。实际上很少与排序相关 - 我还没有验证您的代码是否实际上是合法的 shell 排序...
Improvements you could very easily make:
ShellSort
rather thanshellSort
count
instead ofx
Use the conditional operator, e.g.
Make the code generic - why restrict yourself to integers?
IList<T>
IComparer<T>
, providing an overload which uses the default.Very little of this is actually sort-related - I haven't verified whether your code is actually a legitimate shell sort or not...
在我的测试中,这比使用相同 System.Func 比较器的数组排序快 75% 到 %90。我用它来对自定义结构进行排序。您可以轻松修改它以对类进行排序。
In my test this is 75% to %90 faster than array sort with the same System.Func comparer. I use it to sort a custom struct. you can easily modify it to sort classes.
请参考下面的代码。它将自动计算距离,并且将根据最多生成的三个列表来计算距离。
Please refer below code. Automatically it will calculate the distance and distance will be calculated on consideration of maximum three lists would generate.