计算机考研:数据结构常用算法分析(九)?

第十章

内部排序(内存中排序不需要访问外存)外部排序(排序非常大,最后通过批量读写外存完成排序)

稳定排序和不稳定排序:看同一条记录的相对顺序是否会发生变化。主要看排序过程中的比较是否是相邻记录。如果是相邻比较,一定是稳定排序。如果不是相邻比较,就是不稳定。

内部排序方法到目前为止,各种内部排序方法可以归纳为以下五类:

(1)插入排序;(2)交换排序;(3)选择排序;(4)合并和排序;(5)基数排序。

插入排序:包括直接插入排序和希尔排序。

直接插入排序:(稳定)

算法描述

void in sort(sqList & amp;l)直接插入和排序顺序文件F∧的算法

{ int i,j;

for(I = 2;我& lt= L.leni++)∨插入n-1条记录∨。

{

if(L.R[i]。键

{ L . R[0]= L . R[I];∑要插入的记录首先存储在监控柱中。

长度R[I]= L . R[I-1];

for(j = I-2;法律规则[0]。键

长度R[j+1]= L . R[j];∑录制顺序向后移动∨。

长度R[j+1]= L . R[0];∨原R[i]插入j+1∨的位置。

}

}

}

算法分析

设排序中关键比较次数为C,C的最小时间记为Cmin,最大时间记为Cmax。

(1)原序列(正序列)时,每插入一个R[i]只需要比较一次密钥,即:

(2)当原逆序(键由大到小)时,每插入一个R[i]都要与子表中的i-1键进行比较,加上与自身R[0]的比较,此时比较次数最多,即:

(3)记录总运动次数m(m的最小时间记录为mmin,最大时间记录为mmax)

在正序中,子表中的记录被删除,即:

按照相反的顺序,插入R[i]需要移动整个子表。移动的次数是2+(i-1)=i+1。这时,工作台的移动次数是最大的,即:

排序的时间复杂度取耗时最高的顺序,所以直接插入排序后的T(n)=O(n2)。

Shell (Hill)排序也叫“收缩增量”排序(不稳定)。

交换类排序:(冒泡排序和快速排序)

气泡排序算法的描述

void bub sort(sqList & amp;l)

{ int i,flagflag是记录交换的标志。

重新键入temp

for(I = l . len;我& gt=2;I-)∨n-1最多过∨。

{ flag = 0;//记录每次行程中是否发生了交换。

for(j = 1;j & lt= I-1;j++)∑一次冒泡排序∧

if (L.R[j].key & gtL.R[j+1]。key) ∥两两比较∨

{ temp = L . R[j];∨R[j]?r[j+1]∩

长度R[j]= L . R[j+1];

长度r[j+1]= temp;

flag = 1;

}

if(flag = = 0)break;∑当没有记录交换时,排序完成

}

}

算法分析

设队列长度为n,算法中的键比较总数为c,如果序列为正,则第一遍没有记录交换,退出循环,Cmin = n-1 = O(n);如果是逆序,需要按n-1次排序,每个键的比较次数是i-1(2≤i≤n),所以:

同样,记录的运动的最大数量是:

因此,冒泡排序的时间复杂度为T(n)=O(n2)。而且是稳定的。

快速排序:(不稳定,时间复杂度O(nlogn)),没有辅助空间,但是有最好的也有最差的。

分割算法

int分区(Sqlist & ampl,整数低,整数高)

{ L . R[0]= L . R[低];

pivotkey=L.R[low]。关键;

虽然(低

{ while(low=pivotkey)

-高;

长度R[低]= L . R[高];

虽然(低

++低电平;

长度R[高]= L . R[低];

}

返低;

}

主控功能:

void QSort(Sqlist & amp;l,整数低,整数高)

{如果(低

{

pivotloc=Partition(L,low,high);

QSort(L,low,pivotloc-1);

QSort(L,pivotloc+1,高);

}

}

调用方法:QSort(L,1,L,length);

如果你对考研有疑问,不知道考研中心的内容怎么总结,不了解考研报名的地方政策,点击最下方咨询官网,免费获取复习资料:/xl/