冒泡排序的扩展
冒泡排序原理是,对一个数组进行n-1次遍历,在每一次的遍历中,将最大的数字放到最后。
另一种表达形式则是:
定义一个bool变量,如果在一次数组遍历中,没有产生数字的交换,则bool置为true;否则就继续对整个数组再次进行遍历。
但是这样的排序只能针对于数字形式而不能对普通的数据进行排序。
实例
功能:
利用salary来对employee进行排序。
这里,定义了一个Employee的类,其中有两个属性:
- Name(string类型)
- Salary(int类型)
对于这样的类型数据进行排序,如何去实现?
首先,对于Employee类:
namespace SortExtension
{
class Employee
{
public string Name { get; private set; }
public int Salary { get; private set; }
public Employee(string name, int salary) //定义一个构造函数
{
this.Name = name;
this.Salary = salary;
}
//定义了一个比较函数,以便在排序过程中使用
public static bool Compare(Employee e1, Employee e2)
{
if (e1.Salary > e2.Salary)
return true;
return false;
}
//对类内的ToString方法进行重写,以便可以输出类内的成员
//否则,输出的只是实例对象的名称
public override string ToString()
{
return Name + " " + Salary;
}
}
}
对于函数主体:
namespace SortExtension
{
class Program
{
//泛型
//参数:类型为T的数组 Func委托(两个类型为T的参数和bool类型的返回值)
static void CommonSort<T>(T[] numArray, Func<T,T, bool>compare)
{
bool isSwapped = false;
do
{
isSwapped = false;
for (int i = 0; i < numArray.Length-1; i++)
{
if (compare(numArray[i], numArray[i+1]))
{
isSwapped = true;
T tmp = numArray[i];
numArray[i] = numArray[i + 1];
numArray[i + 1] = tmp;
}
}
} while (isSwapped);
}
static void Main(string[] args)
{
Employee[] employees = new Employee[]
{
new Employee("a", 1),
new Employee("b", 4),
new Employee("c", 3),
new Employee("d", 2),
new Employee("e", 7),
new Employee("f", 0)
};
CommonSort<Employee>(employees, Employee.Compare);
foreach (var e in employees)
Console.WriteLine(e);
Console.ReadKey();
}
}
}