冒泡排序
冒泡排序简单说明:
冒泡排序是一种最常用的排序方法,其过程很简单,就像气泡一样越往上走越大,因此被人们形象的称为冒泡排序法。本实例用C#实现了用冒泡排序法对一组数据进行排序。
技术要点:
冒泡排序的过程很简单。首先将一个记录的关键字和第二个关键字进行比较,若为逆序,则将两个记录交换,然后比较第2个记录和第3个记录的关键字。依次类推,直至第N-1个记录和第n个记录的关键字进行过比较为止。上述过程称为第一趟冒泡排序,执行n-1次上述过程后,排序完成。
代码实现:
/// <summary>
/// 冒泡排序
/// </summary>
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++;
}
}
}
选择排序
选择排序简单说明:
简单选择排序的基本思想是:每一趟在n个记录中选取关键字最小的记录作为有序序列中第I个记录。本实例实现了用选择排序的方法对一组数据进行排序。
技术要点:
选择排序的主要操作是关键字间的比较,显然从n个数据中进行简单排序的算法为:令I从1至n-1,进行n-1趟选择操作。
代码实现:
/// <summary>
/// 选择排序
/// </summary>
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;
}
}
}
插入排序
插入排序简单说明:
直接插入排序是一种最简单的排序方法,基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表,本实例实现了用插入排序对一组数据进行排序。
技术要点:
实现插入排序主要是先找到一个有序序列,然后将下一个关键字插入上述有序序列,然后再从剩下的关键字中选取下一个插入对象,反复执行直到整个序列有序。
代码实现:
/// <summary>
/// 插入排序
/// </summary>
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;
}
}
}
希尔排序
希尔排序简单说明:
希尔排序又称“缩小增量排序”,也是一种插入排序类的方法,但在时间效率上较前述几种排序方法有较大的改进。在待排序记录按关键字“基本有序”时,直接插入排序效率就可以大大提高。而且记录较少时效率也较高。希尔排序正是从这两点分析出发对直接插入排序进行改进得到的一种方法。本实例利用希尔排序方法对一组数据进行了排序。
技术要点:
希尔排序的基本思想是:先将整个待排序记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时再对全体记录进行一次直接插入排序。
希尔排序的特点是:子序列的构成不是简单地“逐段分割”,而是将相隔某个“增量”的记录组成一个子序列。
代码实现
/// <summary>
/// 希尔排序
/// </summary>
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;
}
}
}
}