C#排序算法大全(转载)
冒泡排序
本人用了C#开发出冒泡排序算法。希望能为C#语言的学习者带来一些益处。不要忘了,学语言要花大力气学数据结构
和算法。
using System;
namespace BubbleSorter
{
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();
}
}
}
*****************************************************************
冒泡排序
本人用了C#开发出冒泡排序算法。希望能为C#语言的学习者带来一些益处。不要忘了,学语言要花大力气学数据结构和
算法。
using System;
namespace BubbleSorter
{
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();
}
}
}
*********************************************************************************
实际上任何元素,只要能够互相比较就能够进行排序了。比如你往里面添加一堆字符串,然后Sort,这样也能够排序,只是
排序的规则和字符串的“大小比较”规则一致。
如果你需要对一堆的结构或者类进行排序,你只要实现IComparable这个接口就可以了。这个接口表示这个结构或者类的
实例能够跟另外一个什么东西比较出大小来。eg:
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 < obj
2、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());
//在此添加主程序
}
}
}
给程序可以对自定义的类进行排序!
*********************************************************************************