在C#中进行冒泡排序的最优雅方法是什么?

Kai*_*sor 6 .net c# arrays bubble-sort

可以清理吗?

using System;  
class AscendingBubbleSort 
{     
    public static void Main()
    {
        int i = 0,j = 0,t = 0;
        int []c=new int[20];
        for(i=0;i<20;i++)
        {
            Console.WriteLine("Enter Value p[{0}]:", i);
            c[i]=int.Parse(Console.ReadLine());
        }
        // Sorting: Bubble Sort
        for(i=0;i<20;i++)
        {
            for(j=i+1;j<20;j++)
            {
                if(c[i]>c[j])
                {
                    Console.WriteLine("c[{0}]={1}, c[{2}]={3}", i, c[i], j, c[j]);
                    t=c[i];
                    c[i]=c[j];
                    c[j]=t;
                }
            }
        }
        Console.WriteLine("bubble sorted array:");
        // sorted array output
        for(i=0;i<20;i++)
        {
            Console.WriteLine ("c[{0}]={1}", i, c[i]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 35

你在那里粘贴的东西不是冒泡的.这是一种"蛮力"类型,但它不是冒泡的类型.这是一个通用冒泡排序的例子.它使用任意比较器,但允许您省略它,在这种情况下,默认比较器用于相关类型.它将对IList<T>包括数组在内的任何(非只读)实现进行排序.阅读上面的链接(到维基百科),以更多地了解冒泡排序是如何工作的.注意我们从开始到结束的每个循环如何,但只将每个项目与其邻居进行比较.它仍然是一种O(n 2)排序算法,但在许多情况下它会比你给出的版本更快.

public void BubbleSort<T>(IList<T> list)
{
    BubbleSort<T>(list, Comparer<T>.Default);
}

public void BubbleSort<T>(IList<T> list, IComparer<T> comparer)
{
    bool stillGoing = true;
    while (stillGoing)
    {
        stillGoing = false;
        for (int i = 0; i < list.Count-1; i++)
        {
            T x = list[i];
            T y = list[i + 1];
            if (comparer.Compare(x, y) > 0)
            {
                list[i] = y;
                list[i + 1] = x;
                stillGoing = true;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Ian:不是每个来这里的人都在做作业.通过这个答案,他们将找到他们正在寻找的东西,并可以继续讨论下一个问题.:) (7认同)
  • 但是你没有让学生思考并想出自己的答案...... (6认同)
  • 我(严重)感到困惑,为什么你认为这是一个比原来更"真实"的泡沫排序.两者都冒泡,有不同的优化.您的版本忽略缩小范围. (2认同)
  • @Henk:看一下维基百科的文章.那里描述的算法看起来像原始的吗?特别是,OP的代码比较任意对,立即违背"比较每对相邻项目"部分的算法描述.它当然是一种蛮力交换排序,但它不是一种冒泡的排序. (2认同)

Mic*_*lon 13

在C#中排序的最优雅方式是

Array.Sort( object[] )
Run Code Online (Sandbox Code Playgroud)

除了在老师要求你实施非优雅的冒泡算法的家庭作业问题之外,这将无处不在.;-)

  • 这是一个很好的建议,但它没有回答OP的问题. (2认同)

Jul*_*iet 8

总的来说,您的冒泡排序实现没有任何问题.如果我正在进行真正的代码审查,我会做出以下更改:

选择更多描述性变量名称

为什么你的阵列被调用c

最小化可变范围

所有变量都在函数顶部声明.除非这是作业要求或编码标准,否则声明变量"接近"它们所使用的位置更为惯用,最好是它们具有尽可能小的范围.

所以,消除读取的第一行int i = 0,j = 0,t = 0;.内联循环计数器:

for(int i = 0; i < 20; i++)
Run Code Online (Sandbox Code Playgroud)

并在你使用的地方声明你的临时变量:

                Console.WriteLine("c[{0}]={1}, c[{2}]={3}", i, c[i], j, c[j]);
                int t=c[i];
                c[i]=c[j];
                c[j]=t;
Run Code Online (Sandbox Code Playgroud)

消除硬编码数组边界.

这个:

for(i=0;i<20;i++)
Run Code Online (Sandbox Code Playgroud)

变成这样:

for(i = 0; i < c.Length; i++)
Run Code Online (Sandbox Code Playgroud)