四种简单的排序算法Word文档下载推荐.docx
- 文档编号:15755077
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:11
- 大小:59.15KB
四种简单的排序算法Word文档下载推荐.docx
《四种简单的排序算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《四种简单的排序算法Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
很显然,关键码的选择与数组中记录的类型密切相关,如果记录为int值,则关键码就是本身;
如果记录是自定义对象,它很可能包含了多个字段,那么选定这些字段之一为关键码。
凡是有关排序和查找的算法,就会关系到两个记录比较大小,而如何决定两个对象的大小,应该由算法程序的客户端(客户对象)决定。
对于.NET来说,我们可以创建一个实现了IComparer<
T>
的类(对于C++也是类似)。
关于IComparer<
的更多信息,可以参考这篇文章《基于业务对象的排序》。
最后,为了使程序简单,对于数组为空的情况我并没有做处理。
1.插入排序
算法思想
插入排序使用了两层嵌套循环,逐个处理待排序的记录。
每个记录与前面已经排好序的记录序列进行比较,并将其插入到合适的位置。
假设数组长度为n,外层循环控制变量i由1至n-1依次递进,用于选择当前处理哪条记录;
里层循环控制变量j,初始值为i,并由i至1递减,与上一记录进行对比,决定将该元素插入到哪一个位置。
这里的关键思想是,当处理第i条记录时,前面i-1条记录已经是有序的了。
需要注意的是,因为是将当前记录与相邻的上一记录相比较,所以循环控制变量的起始值为1(数组下标),如果为0的话,上一记录为-1,则数组越界。
现在我们考察一下第i条记录的处理情况:
假设外层循环递进到第i条记录,设其关键码的值为X,那么此时有可能有两种情况:
1.如果上一记录比X大,那么就交换它们,直到上一记录的关键码比X小或者相等为止。
2.如果上一记录比X小或者相等,那么之前的所有记录一定是有序的,且都比X小,此时退出里层循环。
外层循环向前递进,处理下一条记录。
算法实现(C#)
publicclassSortAlgorithm{
//插入排序
publicstaticvoidInsertSort<
T,C>
(T[]array,Ccomparer)
whereC:
IComparer<
{
for(inti=1;
i<
=array.Length-1;
i++){
//Console.Write("
{0}:
"
i);
intj=i;
while(j>
=1&
&
comparer.Compare(array[j],array[j-1])<
0){
swap(refarray[j],refarray[j-1]);
j--;
}
//Console.WriteLine();
//AlgorithmHelper.PrintArray(array);
//交换数组array中第i个元素和第j个元素
privatestaticvoidswap<
(refTx,refTy){
//Console.Write("
{0}<
-->
{1}"
x,y);
Ttemp=x;
x=y;
y=temp;
}
上面Console.WriteLine()方法和AlgorithmHelper.PrintArray()方法仅仅是出于测试方便,PrintArray()方法依次打印了数组的内容。
swap<
()方法则用于交换数组中的两条记录,也对交换数进行了打印(这里我注释掉了,但在测试时可以取消对它们的注释)。
外层for循环控制变量i表示当前处理第i条记录。
publicclassAlgorithmHelper{
//打印数组内容
publicstaticvoidPrintArray<
(T[]array){
Console.Write("
Array:
"
);
foreach(Titeminarray){
{0}"
item);
Console.WriteLine();
//获得Comparer,进行比较
publicclassComparerFactory{
publicstaticIComparer<
int>
GetIntComparer(){
returnnewIntComparer();
publicclassIntComparer:
IComparer<
{
publicintCompare(intx,inty){
returnx.CompareTo(y);
上面这段代码我们创建了一个ComparerFactory类,它用于获得一个IntComparer对象,这个对象实现了IComparer<
接口,规定了两个int类型的关键码之间比较大小的规则。
如果你有自定义的类型,比如叫MyType,只需要在ComparerFactory中再添加一个类,比如叫MyTypeComparer,然后让这个类也实现IComparer<
接口,最后再添加一个方法返回MyTypeComparer就可以了。
输出演示(C#)
接下来我们看一下客户端代码和输出:
staticvoidMain(string[]args){
int[]array={42,20,17,13,28,14,23,15};
//int[]array={9,8,7,6,5,4,3,2,1,0};
AlgorithmHelper.PrintArray(array);
SortAlgorithm.InsertSort
(array,ComparerFactory.GetIntComparer());
算法实现(C++)
//对int类型进行排序
classIntComparer{
public:
staticboolSmaller(intx,inty){
returnx<
y;
staticboolEqual(intx,inty){
returnx==y;
staticboolLarger(intx,inty){
returnx>
};
//插入排序
template<
classT,classC>
voidInsertSort(Ta[],intlength){
for(inti=1;
i<
=length-1;
i++){
while(j>
C:
:
Smaller(a[j],a[j-1])){
swap(a[j],a[j-1]);
2.冒泡排序
如果你从没有学习过有关算法方面的知识,而需要设计一个数组排序的算法,那么很有可能设计出的就是泡沫排序算法了。
因为它很好理解,实现起来也很简单。
它也含有两层循环,假设数组长度为n,外层循环控制变量i由0到n-2递增,这个外层循环并不是处理某个记录,只是控制比较的趟数,由0到n-2,一共比较n-1趟。
为什么n个记录只需要比较n-1趟?
我们可以先看下最简单的两个数排序:
比如4和3,我们只要比较一趟,就可以得出3、4。
对于更多的记录可以类推。
数组记录的交换由里层循环来完成,控制变量j初始值为n-1(数组下标),一直递减到1。
数组记录从数组的末尾开始与相邻的上一个记录相比,如果上一记录比当前记录的关键码大,则进行交换,直到当前记录的下标为1为止(此时上一记录的下标为0)。
整个过程就好像一个气泡从底部向上升,于是这个排序算法也就被命名为了冒泡排序。
我们来对它进行一个考察,按照这种排序方式,在进行完第一趟循环之后,最小的一定位于数组最顶部(下标为0);
第二趟循环之后,次小的记录位于数组第二(下标为1)的位置;
依次类推,第n-1趟循环之后,第n-1小的记录位于数组第n-1(下标为n-2)的位置。
此时无需再进行第n趟循环,因为最后一个已经位于数组末尾(下标为n-1)位置了。
//泡沫排序
publicstaticvoidBubbleSort<
whereC:
{
intlength=array.Length;
for(inti=0;
=length-2;
i+1);
for(intj=length-1;
j>
=1;
j--){
if(comparer.Compare(array[j],array[j-1])<
swap(refarray[j],re
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 排序 算法