可以清理吗?
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]);
}
}
}
答案 0 :(得分:35)
你粘贴的内容不是bubble sort。这是一种“蛮力”类型,但它不是冒泡的类型。这是一个通用冒泡排序的例子。它使用任意比较器,但允许您省略它,在这种情况下,默认比较器用于相关类型。它将对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;
}
}
}
}
答案 1 :(得分:13)
在C#中排序的最优雅方式是
Array.Sort( object[] )
除了在老师要求你实施非优雅的冒泡排序算法的家庭作业问题之外,这将无处不在。 ; - )
答案 2 :(得分:8)
总的来说,您的冒泡排序实施没有任何问题。如果我正在进行真正的代码审查,我会做出以下更改:
选择更具描述性的变量名称
为什么您的数组只调用c
?
最小化可变范围
所有变量都在函数顶部声明。除非这是作业要求或编码标准,否则声明变量“接近”它们所使用的位置更为惯用,最好是它们具有尽可能小的范围。
因此,消除读取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++)
答案 3 :(得分:3)
大多数人都不会打扰优雅的冒泡。但是,在 general 中,我发现这样做:
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
}
换句话说,在最小的适用范围内声明您的变量。否则,您可能会发现自己在代码中的其他位置使用i
或item
执行某些操作,然后再次使用它们。
答案 4 :(得分:2)
我会使用交换方法交换两个数组项。 (如何将交换方法写成作业的详细信息!)
您应该考虑项目已经按顺序的情况
您应该阅读插入排序以获得更多标记: - )
而不是从键盘上读取测试数据,看看你是否可以学习如何使用nUnit
答案 5 :(得分:1)
我个人更喜欢这个:
string foo [] = new string[] {"abc", "def", "aaa", "feaf", "afea" };
Array.Sort(foo);
但那只是我。排序是一个解决的问题,为什么重新发明轮子?
答案 6 :(得分:1)
我认为answer提出的Jon Skeet有所改善。在每个循环之后,迭代次数应排除上一次迭代中处理的最后一项。所以,这是代码:
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++;
}
}
答案 7 :(得分:1)
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双关语中得到一些想法......
答案 8 :(得分:1)
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;
}
答案 9 :(得分:0)
我认为你的算法没问题,但我会把排序功能放在一个单独的类和方法中。