如何在N长度数组中排序前M个元素?

时间:2012-11-26 15:47:35

标签: c# arrays sorting

我有一些关于在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不喜欢为某人做家庭作业。这就是我没有要求代码的原因,我刚刚询问了如何实现这一目标的想法。

再次感谢那些帮助我的人。

7 个答案:

答案 0 :(得分:3)

如果没有看到您的实施,这很难回答。有很多方法可以做到这一点,而且大多数都是直截了当的。

以下是一些想法:

  1. 创建一个“临时”数组,该数组仅保存数字以进行排序,排序,然后替换原始数组(可能是次优解决方案)
  2. 使用for循环迭代您需要的次数(3或其他)。这可能是最好的解决方案
  3. 在这里发布你的代码,一些天真的人可能会给你一个解决方案,所以你不必自己做你的功课。 (这是一种懒惰且不合适的解决方案)

答案 1 :(得分:3)

由于没有效率限制:

  1. 将i设为0。
  2. 查找未排序元素中的最小值。
  3. 将其插入位置i,移动阵列。
  4. 增量i。
  5. 重复M次。
  6. 复杂度为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()