Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';C#中最优雅的冒泡排序方法是什么?_C#_.net_Arrays_Bubble Sort - Fatal编程技术网

什么';C#中最优雅的冒泡排序方法是什么?

什么';C#中最优雅的冒泡排序方法是什么?,c#,.net,arrays,bubble-sort,C#,.net,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);

这个能清理一下吗

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]);
        }
    }
}
使用系统;
类升序泡泡排序
{     
公共静态void Main()
{
int i=0,j=0,t=0;
int[]c=新的int[20];

对于(i=0;i我个人更喜欢:

string foo [] = new string[] {"abc", "def", "aaa", "feaf", "afea" };
Array.Sort(foo);

但那只是我。排序是一个已解决的问题,为什么要重新发明轮子呢?

我认为你的算法还可以,但我会将排序功能放在一个单独的类和方法中。

C中最优雅的排序方式是

这将适用于任何地方,除了在家庭作业问题中,老师要求你实现非优雅的气泡排序算法。 ;-)

  • 我将使用交换方法来交换这两个数组项。 (关于如何编写swap方法的详细信息留作家庭作业!)

  • 你应该考虑一下,当物品已经整理好的时候

  • 您应该仔细阅读插入排序以了解更多标记:-)

  • 与其从键盘上读取测试数据,不如看看你是否能学会如何使用nUnit


您粘贴的内容不是。它是一种“暴力”排序,但不是冒泡排序。下面是一个通用冒泡排序的示例。它使用任意比较器,但允许您忽略它,在这种情况下,默认比较器用于相关类型。它将对任何类型进行排序(非只读)IList的实现,其中包括数组。阅读上面的链接(到维基百科),了解冒泡排序的工作原理。注意我们从开始到结束的每个循环,但只将每个项目与其相邻项目进行比较。它仍然是一个O(n2)排序算法,但在许多情况下,它会比您给出的版本更快

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;
            }
        }
    }
}
public void BubbleSort(IList列表)
{
BubbleSort(列表,Comparer.Default);
}
public void BubbleSort(IList列表、IComparer比较器)
{
bool-stillGoing=true;
虽然(仍在进行)
{
仍然继续=错误;
对于(int i=0;i0)
{
列表[i]=y;
列表[i+1]=x;
仍然继续=正确;
}
}
}
}

大多数人不会费心让气泡排序变得优雅。不过,一般来说,我发现这样做:

for (int i = 0; i < items.Length; i++) {
    Item item = items[i];
    // do something with item
}
Item item;
int i;
for (i = 0; i < items.Length; i++) {
    item = items[i];
    // do something with item
}
for(int i=0;i
比这样做更优雅、更易于维护:

for (int i = 0; i < items.Length; i++) {
    Item item = items[i];
    // do something with item
}
Item item;
int i;
for (i = 0; i < items.Length; i++) {
    item = items[i];
    // do something with item
}
项目;
int i;
对于(i=0;i

换句话说,在最小的适用范围内声明变量。否则,您可能会发现自己在代码中的某个其他点使用
i
,然后在不应该的地方再次使用它们。

总体而言,冒泡排序实现没有问题如果要进行真正的代码审查,我将进行以下更改:

选择更多描述性变量名称

为什么您的数组被称为
c

最小化可变范围

所有变量都在函数顶部声明。除非这是作业要求或编码标准,否则更惯用的方法是将变量声明为“接近”使用位置,最好使变量具有尽可能小的作用域

因此,删除第一行,该行读取
inti=0,j=0,t=0;
。声明循环计数器内联:

for(int i = 0; i < 20; i++)
消除硬编码数组边界。

这:


for(i=0;i我相信建议的方法有改进。每次循环后,迭代次数应排除上一次迭代中处理的最后一项。因此,代码如下:

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

public void BubbleSortImproved<T>(IList<T> list, IComparer<T> comparer)
{
    bool stillGoing = true;
    int k = 0;
    while (stillGoing)
    {
        stillGoing = false;
        //reduce the iterations number after each loop
        for (int i = 0; i < list.Count - 1 - k; 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;
            }
        }
        k++;
    }
}
public void BubbleSortImproved(IList列表)
{
BubbleSortImproved(列表,Comparer.Default);
}
公共无效气泡或改进(IList列表、IComparer比较器)
{
bool-stillGoing=true;
int k=0;
虽然(仍在进行)
{
仍然继续=错误;
//减少每个循环后的迭代次数
for(int i=0;i0)
{
列表[i]=y;
列表[i+1]=x;
仍然继续=正确;
}
}
k++;
}
}
int[]数组={4,5,7,1,8};
int n1,n2;
bool-stillgoing=true;
虽然(仍在进行)
{
仍然继续=错误;
对于(int i=0;i<(array.Length-1);i++)
{                  
if(数组[i]>数组[i+1])
{
n1=阵列[i+1];
n2=阵列[i];
数组[i]=n1;
阵列[i+1]=n2;
仍然继续=正确;
}
}
}
for(int i=0;i
从Jon skeet那里得到一些想法…

public int[]BubbleSortInAesc(int[]输入)
    public int[] BubbleSortInAesc(int[] input)
    {
        for (int i = input.Length; i > 0; i--)
        {
            for (int j = 0; j < i-1; j++)
            {
                if (input[j] > input[j + 1])
                {
                    //Swap the numbers
                    input[j] = input[j + 1]+input[j];
                    input[j + 1] = input[j] - input[j + 1];
                    input[j] = input[j] - input[j + 1];
                }
            }
        }
        return input;
    }
{ 对于(int i=input.Length;i>0;i--) { 对于(int j=0;j输入[j+1]) { //交换号码 输入[j]=输入[j+1]+输入[j]; 输入[j+1]=输入[j]-输入[j+1]; 输入[j]=输入[j]-输入[j+1]; } } } 返回输入; }
优雅和气泡排序不属于同一句话,IMHO。如果这是一个家庭作业,我会让代码尽可能难看,并在上面乱扔评论,比如“故意给代码添加恶心,以反映我对该算法的厌恶”…老师会尊重你的原则。这不是空谈…@Ian:学习h是有价值的
public void BubbleSortImproved<T>(IList<T> list)
{
    BubbleSortImproved<T>(list, Comparer<T>.Default);
}

public void BubbleSortImproved<T>(IList<T> list, IComparer<T> comparer)
{
    bool stillGoing = true;
    int k = 0;
    while (stillGoing)
    {
        stillGoing = false;
        //reduce the iterations number after each loop
        for (int i = 0; i < list.Count - 1 - k; 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;
            }
        }
        k++;
    }
}
int[] array = {4,5,7,1,8};           

int n1, n2;
bool stillgoing = true;

while (stillgoing)
{
    stillgoing = false;
    for (int i = 0; i < (array.Length-1); i++)
    {                  
        if (array[i] > array[i + 1])
        {
            n1 = array[i + 1];
            n2 = array[i];

            array[i] = n1;
            array[i + 1] = n2;
            stillgoing = true; 
        }
    }
}
for (int i = 0; i < array.Length; i++)
{
    Console.WriteLine(array[i]);
}
    public int[] BubbleSortInAesc(int[] input)
    {
        for (int i = input.Length; i > 0; i--)
        {
            for (int j = 0; j < i-1; j++)
            {
                if (input[j] > input[j + 1])
                {
                    //Swap the numbers
                    input[j] = input[j + 1]+input[j];
                    input[j + 1] = input[j] - input[j + 1];
                    input[j] = input[j] - input[j + 1];
                }
            }
        }
        return input;
    }