【问题标题】:How can I improve upon this Insertion Sort?如何改进这种插入排序?
【发布时间】:2018-10-13 14:22:31
【问题描述】:

我觉得这对于插入排序来说效率太低了。我见过的大多数实现都会有一个 while 循环来代替我的第二个 for 循环。除此之外,一旦我的代码中的 j 或等价的代码等于 0 或一旦我在代码的 for 循环中找到的 if 语句被执行,这些 while 循环将终止。问题是每当我尝试实现这样的代码时,我的插入排序都无法正常工作。

getVisitCount 只返回类网页的整数。 AL 是一个 ArrayList。

public void IS()
    {
        Console.WriteLine("Sorting ArrayList.");
        for (int i = 1; i < AL.Count; i++)
        {
            for (int j = i; j > 0; j--)
            {
                Webpage EntryJ = (Webpage)AL[j];
                Webpage EntryBefore = (Webpage)AL[j - 1];

                if (EntryBefore.getVisitCount() < EntryJ.getVisitCount())
                {
                    Webpage temp = EntryBefore;
                    AL[j - 1] = AL[j];
                    AL[j] = temp;
                }
            }
        }

【问题讨论】:

  • 您问题中的一些标点符号会很好。我不知道你在问什么。
  • 这可能更适合code review
  • 出于兴趣,当您可以使用 List<T> 时,为什么还要使用 ArrayList?您的目标是什么版本的 .NET 框架?
  • 如果您认为插入排序效率低下,我非常同意,您可以尝试另一种排序算法,例如“快速排序”或“合并排序”,以加快输出速度。 en.wikipedia.org/wiki/Sorting_algorithm
  • @VincentElbertBudiman - 对于少量元素,InsertionSort 甚至可以比其他算法更快。事实上,像Timsort 这样的算法已经过优化,因此它们会切换到 InsertionSort 来对列表的一小部分进行排序。

标签: c# loops sorting for-loop arraylist


【解决方案1】:

如果您需要对数组列表进行排序,您可以将其转换为您的特定类型,然后将其转换为列表。使用 list 你可以简单地调用 LINQ OrderBy 来获得排序的列表:

public class Webpage
{
    public int getVisitCount()
    {
        return DateTime.Now.Second * 2;
    }

    public static List<Webpage> Sort(ArrayList AL)
    {
        var list = AL.Cast<Webpage>().ToList();
        var ordered = list.OrderBy(x => x.getVisitCount());

        return list;
    }
}

【讨论】:

  • 请记住,Linq 排序并不稳定(相等的元素并不总是保持其原始顺序),因此这可能符合也可能不符合 OP 的意图。
【解决方案2】:

这是您的代码正在执行的操作:

            int[] AL = { 4, 3, 2, 1 };
            for (int i = 1; i < AL.Count(); i++)
            {
                for (int j = i; j > 0; j--)
                {
                    if (AL[j-1] < AL[j])
                    {
                        int temp = AL[j -1];
                        AL[j - 1] = AL[j];
                        AL[j] = temp;

                    }
                    Console.WriteLine("i = '{0}', j = '{1}', array = '{2}'", i.ToString(), j.ToString(),string.Join(",", AL.Select(x => x.ToString())));
                }
            }
            Console.ReadLine();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多