您的位置:首页 > 编程语言 > C#

C# 算法 之 排序算法

2012-08-29 14:58 375 查看
排序(Sort)是计算机内经常进行的一种操作,其目的是将一组“无序”的记录调整为“有序”的记录序列,使之按关键字递增(或递减)依次排列起来。

在排序过程中,若将整个文件都放在内存中处理,排序时不涉及数据的内 外存交换,则称之为内部排序;反之,若排序过程中要进行数据的内外存交换,则称为外部排序

按策略可将内部排序分为五类:插入排序 选择排序 交换排序 归并排序 分配排序

插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,知道全部记录插入完成为止。插入排序的方法有两种:

直接插入排序和希尔排序

直接插入排序:

排序过程的某一中间时刻,R被划分成两个子区间R[0...i-1](已排好序的有序区)和[i...n-1](当前未排序的部分,无序区).

直接插入排序的基本操作使将当前无序区的第一个记录插入到有序区R[0....i-1]中的适当位置上,使R[0...n]变为有序区。因为这种方法每次使有序区增加1个记录,通常称为增量法。

MergeSort

/// <summary>
/// 两两归并
/// </summary>
/// <param name="sqList"></param>
/// <param name="len"></param>
public static void Merge(SeqList<int> sqList, int len)
{
int m = 0;        //临时顺序表中的起始位置
int l1 = 0;       //第1个有序表的起始位置
int h1;           //第1个有序表的结束位置
int l2;           //第2个有序表的起始位置
int h2;           //第2个有序表的结束位置
int i = 0;
int j = 0;

//临时表,用于临时将俩个有序表合并为一个有序表
SeqList<int> temp = new SeqList<int>(sqList.GetLength());
//归并处理
while (l1 + len < sqList.GetLength())
{
l2 = l1 + len;  //第2个有序表的起始位置
h1 = l2 - 1;    //第1个有序表的结束位置
//第2个有序表的结束位置
h2 = (l2 + len - 1 < sqList.GetLength()) ? l2 + len - 1 : sqList.Maxsize - 1;
j = l2;
i = l1;
//两个记录表排序
while ((i <= h1) && (j <= h2))
{
if (sqList.Data[i] <= sqList.Data[j])
temp.Data[m++] = sqList.Data[i++];
else
temp.Data[m++] = sqList.Data[j++];
}
//第1个有序表中个还有记录没有排序完
while (i <= h1)
{
temp.Data[m++] = sqList.Data[i++];
}
//第2个有序表中个还有记录没有排序完
while (j <= h2)
{
temp.Data[m++] = sqList.Data[j++];
}
l1 = h2 + 1;
}
i = l1;
//原顺序表还有记录没有排序完
while (i < sqList.GetLength())
{
temp.Data[m++] = sqList.Data[i++];
}
//临时顺序表中的记录复制到元顺序表,是原顺序表中的记录有序。
for (i = 0; i < sqList.GetLength(); i++)
{
sqList.Data[i] = temp.Data[i];
}
}

/// <summary>
/// 归并排序
/// </summary>
/// <param name="sqList"></param>
public static void MergeSort(SeqList<int> sqList)
{
int k = 1;       //归并增量
while (k < sqList.GetLength())
{
Merge(sqList, k);
k *= 2;
}
}


注:本文整理自《数据结构(C#语言版)》!!!

复制搜索

复制搜索

复制搜索

复制搜索

复制搜索

复制搜索

复制搜索

复制搜索

复制搜索

复制搜索

复制搜索

复制搜索
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: