在排序数字时将数字插入数组的更好方法

时间:2016-12-15 10:07:56

标签: c# sorting

假设我想将值插入数组,同时对其进行排序。 这是我的解决方案:

int[] arr = new int[5];
int  k;
arr[0] = int.Parse(Console.ReadLine());

for (int i = 1; i < arr.Length; i++)
{
    int num = int.Parse(Console.ReadLine());

    for (k = i; k > 0 && num < arr[k - 1];--k) arr[k] = arr[k - 1];

    arr[k] = num;
}

我知道我没有处理异常,我只是谈论代码本身。

有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

您可以使用SortedSet<>,它会在您添加项目时自动排序。

var numbers = new SortedSet<int>()
{
    4,
    9,
    6,
    3
};

foreach (var number in numbers)
{
    Console.WriteLine(number);
}

答案 1 :(得分:0)

如果它不必是数组,你可以这样做:

static void Main(string[] args)
{
 List<int> list = new List<int>
  {
    1,
    2,
    7,
    10
  };

  int k = int.Parse(Console.ReadLine());
  list.Add(k);
  list.Sort();
}

编辑:如果你想在插入时进行排序,你可以这样做:

 int k = int.Parse(Console.ReadLine());
  int i = list.Where(x => x > k).Min();
  int index = list.IndexOf(i);
  list.Insert(index, k);

答案 2 :(得分:0)

您可以使用List并将其转换为数组。当您始终维护列表时,可以使用列表的BinarySearch方法获取插入索引:

const int length = 5;

List<int> result = new List<int>(length);

for (int i = 0; i < length; i++) {
    int num = int.Parse(Console.ReadLine());
    int insertIndex = result.BinarySearch(num);
    if (insertIndex < 0) {
        insertIndex = ~insertIndex;
    }
    result.Insert(insertIndex, num);
}
int[] arr = result.ToArray();

二进制搜索比您当前执行的线性搜索更快 。使用当前的5个值,您无法看到它。您可以通过更大的列表(hundrets或数千个值)进行defenitely看到它。