我有一些关于在C#中排序数组的任务。我一直在尝试我能想到的一切 - 没有运气。
任务是通过已知的排序算法(插入,选择,冒泡,快速)对整数数组进行排序。事实是,我必须排序 ONLY 最小的M
元素。
示例:我有一个包含7个元素2 9 8 3 4 15 11
的数组,我需要对最小的3个元素进行排序,以便我的数组变为2 3 4 9 8 15 11
。
请帮助,我似乎无法在SO中找到任何内容,也无法通过Google找到任何内容。我没有要求为我做所有的算法,我只需要其中一个只是为了掌握这种可能性。
E:谢谢你的想法。我已经审核了您的所有建议,并完成了这样的插入排序:static int[] insertSort(int[] arr, out int swaps, out int checks) {
int step = 0;
swaps = 0;
checks = 0;
for (int i = 0; i < arr.Length; i++) {
int min = arr[i], minind = i;
for (int j = i + 1; j < arr.Length; j++) {
checks++;
if (arr[j] < min) {
min = arr[j];
minind = j;
}
}
int temp = arr[minind];
if (step < M) {
for (int j = minind; j > i; j--) {
swaps++;
arr[j] = arr[j - 1];
}
arr[i] = temp;
swaps++;
step++;
}
}
return arr;
}
交换和检查 - 我的申请要求。
P.S。我已经多次见过SO不喜欢为某人做家庭作业。这就是我没有要求代码的原因,我刚刚询问了如何实现这一目标的想法。
再次感谢那些帮助我的人。
答案 0 :(得分:3)
如果没有看到您的实施,这很难回答。有很多方法可以做到这一点,而且大多数都是直截了当的。
以下是一些想法:
答案 1 :(得分:3)
由于没有效率限制:
复杂度为O(N * M)。
答案 2 :(得分:1)
我认为这就是你要找的东西,这是一个基于特定indix的数组升序排序的例子。
int startIndex=2;
int endIndex=5;
int[] elements=new int[7];
elements[0]=2;
elements[1]=9;
elements[2]=8;
elements[3]=3;
elements[4]=4;
elements[5]=15;
elements[6]=11;
for (int a=startIndex-1;a<endIndex;a++){
for(int b=startIndex-1;b<endIndex;b++){
if (elements[a]<elements[b]){
int temp =elements[a];
elements[a]=elements[b];
elements[b]=temp;
}
}
}
for (int c=0;c<elements.Length;c++){
Console.Write(elements[c]+",");
}
只需更改“&lt;”到“&gt;”如果你想对它进行排序。
答案 3 :(得分:0)
您想了解一下您需要使用的排序算法。比方说,我们使用的是使用for循环的。大多数情况下你会看到像这样的东西
for(int i = 0; i&lt; arrayName.length(); i ++) {}
在您的情况下,只需更改for循环的参数
for(int i = 0; i&lt; M; i ++) {}
其中M小于arrayName.length();并且是您想要排序的起始位置数。
阵列的其余部分,未触及,应该保持不变。
答案 4 :(得分:0)
夫妻俩。大多数排序算法使用array.length作为最大范围。 你可以在那里使用m吗?即
for (int i = 0; i < m; i++)
此外,您可以使用前m个字符的临时数组,对其进行排序,然后重新分配。
int[] temp;
for (int i = 0; i < m; i++)
{
temp[i] = realArray[i];
}
//sort, then
for (int i = 0; i < m; i++)
{
realArray[i] = temp[i];
}
答案 5 :(得分:0)
我会对整个数组进行排序并将其放入另一个数组中。
截断新数组以仅保留最小的x元素。 从该数组中获取最大数字(在您的示例中为4)。
循环遍历初始数组并附加所有更高的数字。
输入:2 9 8 3 4 15 11
全部排序:2 3 4 8 9 11 15
截断:2 3 4
从此数组中获取最高值(4)
循环遍历原始数组并附加
2高于4吗?没有
9比9高吗?是的,追加(我们现在有:2 3 4 9)
8比8高吗?是的,追加(我们现在有:2 3 4 9 8)
3高于4吗?没有
4比4高吗?没有
15比15高吗?是的,追加(我们现在有:2 3 4 9 8 15)
11比11高吗?是的,追加(我们现在有:2 3 4 9 8 11)
*这不是最有效的方法,如果您有重复的数字可能会导致问题
答案 6 :(得分:-2)
使用LINQ的任何处方?
int a[] = new int[] {2, 9, 8, 3, 4, 15, 11};
const int M = 5;
a = a.Take(M).OrderBy(e => e).ToArray(); // EDIT: Added .ToArray()