c# - 为什么我的排序算法不能正确排序数组中的所有值?
问题描述
我创建了一个排序算法来对我的程序中的数组进行排序。该算法对大部分数组进行了很好的排序,但是数组末尾附近的一些值根本不在正确的位置。
string temp;
int counter = 0;
do
{
for (int i = 0; i < low256.Length - 1; i++)
{
for (int j = i + 1; j < low256.Length; j++)
{
counter += 1;
if (string.Compare(low256[i], low256[j]) == -1)
{
temp = low256[i];
low256[i] = low256[j];
low256[j] = temp;
counter = 0;
}
}
}
} while (counter <= 255);
foreach(string value in low256)
{
Console.Write(value + " ");
}
这是运行程序后打印到控制台的内容:
-9.7067 -8.6887 -8.0983 -8.0075 -7.9666 -7.9489 -7.6039 -7.5488
-7.3513 -6.9742 -6.9052 -6.8570 -6.7794 -6.7452 -6.6020 -6.5882
-6.4784 -6.3746 -6.3607 -6.3009 -6.2648 -6.1930 -6.1609 -5.9756
-5.9369 -5.9168 -5.8945 -5.8634 -5.7830 -5.7047 -5.6102 -5.5937
-5.5481 -5.5326 -5.4321 -5.1973 -5.1795 -5.1056 -5.0968 -5.0614
-5.0608 -4.9593 -4.8816 -4.8364 -4.8080 -4.7547 -4.7408 -4.7365
-4.7127 -4.7031 -4.5894 -4.5882 -4.5257 -4.4337 -4.4300 -4.4292
-4.4101 -4.3792 -4.3786 -4.3208 -4.3167 -4.2972 -4.2907 -4.1644
-4.1373 -4.1147 -4.1108 -4.1058 -4.1052 -4.0797 -4.0521 -4.0468
-4.0301 -4.0268 -4.0207 -4.0183 -4.0053 -3.9670 -3.9084 -3.8817
-3.7977 -3.7881 -3.7660 -3.7522 -3.7302 -3.7159 -3.7108 -3.6910
-3.6878 -3.6477 -3.6458 -3.5687 -3.5389 -3.5337 -3.4929 -3.4872
-3.4664 -3.4661 -3.4490 -3.4167 -3.4156 -3.4129 -3.4128 -3.4052
-3.3939 -3.3758 -3.3587 -3.3560 -3.3456 -3.3152 -3.2829 -3.2744
-3.1604 -3.1455 3.1389 -3.0993 -3.0205 -3.0090 -3.0059 -2.9945
-2.9888 -2.9774 -2.9658 -2.9553 -2.9482 -2.8881 -2.8579 -2.8461
-2.8410 -2.8053 -2.7924 -2.7467 -2.7309 -2.6911 -2.6730 -2.6556
2.6365 -2.6039 -2.5892 -2.5890 -2.5782 -2.5590 -2.5356 -2.4829
-2.4732 -2.4509 -2.4489 -2.4485 -2.4439 -2.4173 -2.4172 -2.4146
-2.3862 -2.3849 -2.3792 -2.3264 2.3110 -2.3061 -2.3004 -2.2941
-2.2638 -2.2634 -2.2483 -2.2432 -2.2276 -2.2249 -2.1916 -2.1864
-2.1530 -2.1132 -2.0508 -2.0225 -2.0215 -2.0099 1.9737 -1.9679
1.9267 -1.9198 -1.8669 -1.8634 -1.8601 -1.8265 -1.8077 -1.8073
-1.7836 -1.7579 -1.7535 -1.7461 -1.7441 -1.7276 -1.6917 -1.6747
1.6397 -1.6188 -1.6033 -1.5840 -1.5717 -1.5640 -1.5091 -1.5078
-1.4936 1.4928 -1.4872 -1.4680 -1.4533 1.4052 -1.3884 -1.3876
-1.2864 -1.2753 1.2380 -1.2229 -1.1996 -1.1638 -1.1551 1.1389
-1.0769 -1.0610 -0.9981 -0.9516 -0.8525 0.8319 -0.8293 0.7427 0.7006
0.6687 -0.6509 0.6507 -0.6426 -0.5913 0.5592 0.5588 -0.5507 -0.5409
-0.5287 -0.5132 -0.4933 -0.4753 -0.4281 0.4236 -0.4180 0.4096 -
0.3986 -0.3790 0.3696 -0.3360 -0.2987 0.2985 -0.2915 0.2743 0.2053
0.1976 0.1418 -0.1022 -0.0594 0.0357
如您所见,它返回的数组中的一些值位于错误的位置,例如 0.4236 放在 -0.4180 之前。
解决方案
在您的内部循环中,您可以解析需要比较的项目:
for (int j = i + 1; j < low256.Length; j++)
{
counter += 1;
var a = double.Parse(low256[i]);
var b = double.Parse(low256[j]);
if (a.CompareTo(b) == 1) // change to -1 to order by descending
// rest of code
如果这不是家庭作业,请使用 linq:
low256 = low256
.Select(double.Parse)
.OrderBy(x => x)
.Select(x => x.ToString("0.0000"))
.ToArray();
此外,在字符串表示中对数字进行某种排序也是个坏主意。所以最好low256
先将所有项目转换为双打然后做你需要的
推荐阅读
- javascript - case语句内的Javascript箭头函数
- html - 如何获取“video-stream html5-main-video”的宽度和高度?
- javascript - 如果脚本有无限循环,则停止 python-shell
- jquery - 在滚动时隐藏/显示 DIV
- postgresql - 为什么选择查询在 Postgres 中很慢?
- javascript - Blazor - InputSelect 上的级联下拉菜单未加载
- java - 从 Java 中的 JPopupMenu 动作监听器获取目标
- python - 如何减少向量特征的数量?
- scala - 按列表分组
- spring-boot - Spring boot:从 pom-xml 中删除了 spring 安全性依赖项,但仍在 Intellij 中生成密码