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

可以清理吗?

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;jc[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]); } } } 

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

 public void BubbleSort(IList list) { BubbleSort(list, Comparer.Default); } public void BubbleSort(IList list, IComparer 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; } } } } 

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

 Array.Sort( object[] ) 

除了在老师要求你实现非优雅的冒泡排序算法的家庭作业问题之外,这将无处不在。 😉

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

选择更多描述性变量名称

为什么你的数组只调用c

最小化可变范围

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

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

 for(int i = 0; i < 20; i++) 

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

  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; 

消除硬编码数组边界。

这个:

 for(i=0;i<20;i++) 

变成这样:

 for(i = 0; i < c.Length; 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 } 

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

  • 我会使用交换方法交换两个数组项。 (如何将交换方法写成作业的详细信息!)

  • 你应该考虑物品已经整齐的情况

  • 您应该阅读插入排序以获得更多标记:-)

  • 而不是从键盘读取测试数据,看看您是否可以学习如何使用nUnit

我个人更喜欢这个:

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

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

我相信Jon Skeet提出的答案有所改善。 在每个循环之后,迭代次数应排除上一次迭代中处理的最后一项。 所以,这是代码:

 public void BubbleSortImproved(IList list) { BubbleSortImproved(list, Comparer.Default); } public void BubbleSortImproved(IList list, IComparer 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]); } 

从Jon双关语中得到一些想法......

  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; } 

我认为你的算法没问题,但我会把排序function放在一个单独的类和方法中。