如何将此伪代码增强型InsertionSort转换为C#?

时间:2018-04-25 17:13:57

标签: c# arrays sorting arraylist pseudocode

我是一名学生,并获得了增强型插入排序的伪代码,但我真的很难将其转换为C#。

伪代码:

  
      
  1. 计算长度n
  2.   
  3. var i = 1,j
  4.   
  5. if(a [i]< a [i-1]),然后
  6.   
  7. if(a [i]< a [0]),然后
  8.   
  9. 设置j = 0和goto-35
  10.   
  11. 其他j = i / 2和goto-10
  12.   
  13. 结束如果
  14.   
  15. 其他i ++和repeat-3
  16.   
  17. 结束如果
  18.   
  19. if(a [i]   
  20. elseif(if(a [i] = = a [j]),然后
  21.   
  22. 设置j = j + 1和goto-35
  23.   
  24. 结束如果
  25.   
  26. 其他goto-25
  27.   
  28. 结束如果
  29.   
  30. while((j-1)> = 0),执行
  31.   
  32. j = j-2且if(a [i]> a [j]),则
  33.   
  34. if(a [i]< a [j + 1]),然后
  35.   
  36. 设置j = j + 1和goto-35
  37.   
  38. else set j = j + 2 and goto-35
  39.   
  40. 结束如果
  41.   
  42. else if(a [i] = = a [j]),然后
  43.   
  44. 设置j = j + 1和goto-35
  45.   
  46. 其他返回
  47.   
  48. 虽然(((i-1)-j)> = 0),但
  49.   
  50. J = j + 2且(a [i]   
  51. 如果(a [i]< a [j-1]),那么
  52.   
  53. 设置j = j-1和goto-35
  54.   
  55. 另外设置j + j + 0和goto-35
  56.   
  57. 结束如果
  58.   
  59. 否则if(a [i] = = a [j]),那么
  60.   
  61. 设置j = j + 1和goto-35
  62.   
  63. 其他返回
  64.   
  65. 结束如果
  66.   
  67. 交换[i]和[j]
  68.   
  69. J ++
  70.   
  71. while(j = i-1),做
  72.   
  73. i ++和goto-3
  74.   
  75. END
  76.   

到目前为止,我用C#编写的是:

static public void EnhancedInsertionSort(ArrayList List)
{
    int n = List.Count;
    int i = 1;
    int j = i-1;

    do
    {
        if (((Webpage)List[i]).getVisits() < ((Webpage)List[i - 1]).getVisits())
        {
            if (((Webpage)List[i]).getVisits() < ((Webpage)List[0]).getVisits())
            {
                j = 0;
                object temp = List[i];
                List[i] = List[j];
                List[j] = temp;
                j++;
            }
            else
                j = i / 2;
        }
        else
            i++;
        if (((Webpage)List[i]).getVisits() < ((Webpage)List[j]).getVisits())
        {
            while ((j - 1) >= 0)
            {
                j = j - 2;
                if (((Webpage)List[i]).getVisits() > ((Webpage)List[j]).getVisits())
                {
                    if (((Webpage)List[i]).getVisits() < ((Webpage)List[j + 1]).getVisits())
                    {
                        j = j + 1;
                        object temp = List[i];
                        List[i] = List[j];
                        List[j] = temp;
                        j++;
                    }
                }
                else
                {
                    if (((Webpage)List[i]).getVisits() == ((Webpage)List[j]).getVisits())
                        j = j + 1;
                    else return;
                }
            }
        }
        else
            if (((Webpage)List[i]).getVisits() == ((Webpage)List[j]).getVisits())
            j = j + 1;

    } while (j == i-1);

}

但是现在我完全被困惑了。我确信我已经犯了一些解释错误,因为我正在努力与#34; goto&#34;关键字以及如何将它们转换为C#循环。我已经研究了这个,并且理解了基本的想法,但是在一个算法中使用了很多goto个关键字,我发现这个过程非常混乱。

我真的很感激任何人都能提供的任何帮助!

注意:我正在尝试按属性Visits(整数值)的降序对对象的ArrayList(&#34;网页&#34;)进行排序。

1 个答案:

答案 0 :(得分:0)

伪代码是一项旧发明,而伪代码尚未更新为现代语言。我相信旧的GOTO语句应该替换为调用子程序(或函数)来执行小函数。例如:

static public void EnhancedInsertionSort(ArrayList List)
{
    int n = List.Count;
    int i = 1;
    int j = i-1;

    do
    {
        if ( pageWithLessVisits(List[i], List[i - 1]) )
        {
            if ( pageWithLessVisits(List[i], List[0]) )
            {
                j = 0;
                object temp = List[i];
                List[i] = List[j];
                List[j] = temp;
                j++;
            }
            else
                j = i / 2;
        }
        else
            i++;
        if (pageWithLessVisits(List[i],List[j]))
        {
            while ((j - 1) >= 0)
            {
                j = j - 2;
                if (pageWithMoreVisits(List[i], List[j]))
                {
                    if (pageWithLessVisits(List[i],List[j + 1]))
                    {
                        j = j + 1;
                        object temp = List[i];
                        List[i] = List[j];
                        List[j] = temp;
                        j++;
                    }
                }
                else
                {
                    if (pageWithEqualVisits(List[i], List[j]))
                        j = j + 1;
                    else return;
                }
            }
        }
        else
            if (pageWithEqualVisits(List[i], List[j]))
                j = j + 1;

    } while (j == i-1);

}

static private bool pageWithLessVisits(Webpage page1, Webpage page2)
{
    return page1.getVisits() < page2.getVisits()
}

static private bool pageWithMoreVisits(Webpage page1, Webpage page2)
{
    return page1.getVisits() > page2.getVisits()
}

static private bool pageWithEqualVisits(Webpage page1, Webpage page2)
{
    return page1.getVisits() == page2.getVisits()
}

您甚至可以在de IF中封装小代码。使代码与伪代码一样清晰。