呵呵!在C#里面你完全不需要管具体的排序算法,你只要将所有的元素放到ArrayList里面,然后Sort就行了!ArrayList arr = new ArrayList();
arr.Add(10);
arr.Add(5);
arr.Add(0); // 或者使用arr.AddRange(xxx); xxx为一个一维数组
arr.Sort();这样就好了。(待续)
arr.Add(10);
arr.Add(5);
arr.Add(0); // 或者使用arr.AddRange(xxx); xxx为一个一维数组
arr.Sort();这样就好了。(待续)
{
public class BubbleSorter
{
public void Sort(int [] list)
{
int i,j,temp;
bool done=false;
j=1;
while((j<list.Length)&&(!done))
{
done=true;
for(i=0;i<list.Length-j;i++)
{
if(list[i]>list[i+1])
{
done=false;
temp=list[i];
list[i]=list[i+1];
list[i+1]=temp;
}
}
j++;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
BubbleSorter sh=new BubbleSorter();
sh.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
选择排序
本人用了C#开发出选择排序算法。希望能为C#语言的学习者带来一些益处。不要忘了,学语言要花大力气学数据结构和算法。
using System;
namespace SelectionSorter
{
public class SelectionSorter
{
private int min;
public void Sort(int [] list)
{
for(int i=0;i<list.Length-1;i++)
{
min=i;
for(int j=i+1;j<list.Length;j++)
{
if(list[j]<list[min])
min=j;
}
int t=list[min];
list[min]=list[i];
list[i]=t;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,3,6,10,55,9,2,87,12,34,75,33,47};
SelectionSorter ss=new SelectionSorter();
ss.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
插入排序 插入排序算法。对想提高C#语言编程能力的朋友,我们可以互相探讨一下。如:下面的程序,并没有实现多态,来,帮它实现一下。
using System;
namespace InsertionSorter
{
public class InsertionSorter
{
public void Sort(int [] list)
{
for(int i=1;i<list.Length;i++)
{
int t=list[i];
int j=i;
while((j>0)&&(list[j-1]>t))
{
list[j]=list[j-1];
--j;
}
list[j]=t;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,13,3,6,10,55,98,2,87,12,34,75,33,47};
InsertionSorter ii=new InsertionSorter();
ii.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0}",iArrary[m]);
Console.WriteLine();
}
}
}
希尔排序 希尔排序是将组分段,进行插入排序. 对想提高C#语言编程能力的朋友,我们可以互相探讨一下。如:下面的程序,并没有实现多态,来,帮它实现一下。
using System;
namespace ShellSorter
{
public class ShellSorter
{
public void Sort(int [] list)
{
int inc;
for(inc=1;inc<=list.Length/9;inc=3*inc+1);
for(;inc>0;inc/=3)
{
for(int i=inc+1;i<=list.Length;i+=inc)
{
int t=list[i-1];
int j=i;
while((j>inc)&&(list[j-inc-1]>t))
{
list[j-1]=list[j-inc-1];
j-=inc;
}
list[j-1]=t;
}
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
ShellSorter sh=new ShellSorter();
sh.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
class myRecord : IComparable
{
public int Num;
public string Description; public int CompareTo(object obj)
{
myRecord rec;
rec = obj as myRecord;
// 如果这个有待比较的东西是一个myRecord类
if (rec != null)
{
return Num.CompareTo(rec.Num); // 大小取决于双方的Num
}
else
{
return -1; // 否则总比这个东西小。
}
}
}这样myRecord加入到ArrayList之后,就能够按照Num的大小进行排序了。需要注意的是,ArrayList.Sort排序后是一个升序结果,如果你需要降序的结果,只要把return的值取负值就行了,eg: return -Num.CompareTo(rec.Num);另外关于那个return -1需要做一些说明:
1、CompareTo的返回值有如下含义:
>0 表示this > obj
==0 表示this == obj
<0 表示this < obj2、CompareTo的参数obj不假定就是和this属于同一个类型,因此必须自己进行判断。这里的else子句就是为了处理类型不一样的情况。3、当类型不一样的时候,也可以考虑throw Exception,但是这样也许会引起不必要的程序异常终止,所以我个人一般采用return -1; 的操作。那么return -1是什么意思呢?由于Sort总是升序的,而一般情况下我们总是比较容易注意到前面的东西,前面的东西一定是CompareTo小的,因此需要把myRecord的项目尽可能提到前面。为此,只要obj不是myRec,就返回-1。4、尽管从理论上来说,arr.Sort允许不同类型的数据之间进行排序,但是这样做是不推荐的。因为你很难保重Sort到底调用了myRecord对象的CompareTo还是obj对象的CompareTo。如果obj对象也总是希望自己处于最前面,就可能引起混乱。或者obj总是在类型不一致的时候抛出异常,那么程序还是会异常终止。因此,尽量不要在需要Sort的ArrayList混装不同类型的元素。5、使用Sort的时候需要确保两条:
A、这个ArrayList不能够没有任何元素,否则会引发异常(虽然这是一个MS的Bug,但是你不做Count == 0的检查,别人就会以为这是你的Bug)。
B、这个ArrayList里面的每一个元素都实现了IComparable接口,或者你为Sort提供了实现IComparer接口的对象,否则也会引发异常。所有系统预定义的类型都实现了IComparable接口,不需要担心。至于IComparer,我建议不要管它,除非你希望一会儿按照Num来排序,另一会儿按照Description来排序,再一会儿按照别的什么东西来排序。所以这里先不介绍了,如果你有这个需求,告诉我。6、不用怀疑性能方面的问题,一般情况下足够快了。如果你发现性能方面的问题,先找找别的原因。至少,你应该想我这样写成class myRecord,而不是structure myRecord。
using System;
namespace ExampleModel
{
public class BubbleSorter //冒泡排序
{
static public void Sort(object[] sortArray,CompareOp rhsLhsGreater)
{
for(int i=0;i<sortArray.Length;i++)
{
for(int j=0;j<i;j++)
{
if(rhsLhsGreater(sortArray[i],sortArray[j]))
{
object temp = sortArray[i];
sortArray[i] = sortArray[j];
sortArray[j] = temp;
}
}
}
}
}
public class Employee
{
private string name;
private decimal salary;
public Employee(string name,decimal salary) {
this.name = name;
this.salary = salary;
//在此添加构造函数代码
}
public override string ToString()
{
return string.Format(name + ",{0}",salary);
}
public static bool RhsLhsGreater(object lhs,object rhs)
{
Employee Lhs = (Employee)lhs; //类型转换
Employee Rhs = (Employee)rhs;
return (Rhs.salary > Lhs.salary)?true:false;
}
//在此添加类代码
}
public delegate bool CompareOp(object lhs,object rhs); //委托
public class MainEntryPoint
{
public static void Main(string[] args)
{
Employee[] employees =
{
new Employee("Karli Watson",20000),
new Employee("Bill Gates",10000),
new Employee("Peng Song",25000),
new Employee("Mortimer",(decimal)1000000.38),
new Employee("Arabel Jones",23000),
new Employee("Avon from 'Blak's'",50000)
};
CompareOp EmployeeCompareOp = new CompareOp(Employee.RhsLhsGreater);
BubbleSorter.Sort(employees,EmployeeCompareOp);
for(int i=0;i<employees.Length;i++)
Console.WriteLine(employees[i].ToString());
//在此添加主程序
}
}
}
给程序可以对自定义的类进行排序!