对于算法之前我们小组已经讨论过了,但自己认为理解还不够深刻,今天再次总结一下,加深自己的印象。首先算法分为四类:插入排序、交换排序、选择排序和归并排序。从这几个算法的名字就可以透露出其中内涵。
插入排序:
1)直接插入排序:
一种简单排序算法,基本思路:将每个记录插入到一个已有序表中去,从而得到一个新的、记录数加1的有序表。第一次插入时,将第一个数看做一个有序的,直接进行比较并插入记录。
<span style="font-family:KaiTi_GB2312;font-size:18px;"> void StrightInsertSort ( List R ,int n )
{
int i,j;
for ( i = 2; i <= n;i++)
{
R[0]=r[i];
j=j-1;
while (R[0].key < R[j].key)
{
r[j+1] = R[j];
j--;
}
R[j+1]=R[0];
}
}</span>
2)Shell排序
又称“缩小增量排序”,基本思想是:先将待排序列分割成若干子序列,然后分别进行直接插入排序,等到整个序列中的记录基本有序时,在对全体记录进行一次直接插入排序。具体链接地址:Shell排序--软考(五)
交换排序
1)冒泡排序
过程:首先将第一个记录的键值和第二个记录的键值进行比较,若为逆序,则将这两条记录交换,直到完成第n-1个记录第n个记录的键值的交换为止,然后再进行第二趟起泡排序,对前n-1个记录进行同样操作,期结果是次大键值的记录安置在第n-1个位置上。重复以上操作,直到没有进行交换的操作。
<span style="font-family:KaiTi_GB2312;font-size:18px;">void BubbleSort (List R , int n)
{
int i,j,temp,endsort;
for(i=1;i<=n-1;i++)
{
endsort =0;
for (j=1;j<=n-i;j++)
{
if (R[j].key >R[j+1].key)
{
temp = R[j];
R[j] = R[j=1];
R[j+1]=temp;
endsort = 1;
}
}
if ( endsort == 0) break;
}
}</span>
2)快速排序法
是对冒泡排序的一种改进,基本思想:在n个记录中取某一个记录的键值为标准(通常取第一个记录键值为基准),通过一趟排序将待排的记录分为小于或等于这个键值和大于这个键值的两个独立的部分,然后对这两部分继续分别进行快速排序,使整个序列有序。
选择排序
1)直接选择排序
基本思想:是在第i次选择操作中,通过n-i次键值比较,从n-i+1个记录中选出键值最小的记录,并和第i个进行交换,如果是i本身则不进行交换。
void SelectSort (List R, int n)
{
int min,i,j;
for(i=1;i<n-1;i++)
{
min=i;
for(j=j+1;j<=n;j++)
if (R[j].key < R[min].key) min=j;
if (min ! = i)
{
t=R[i].key;
R[i].key=R[min].key;
R[min].key=t;
}
}
}
2)堆排序
堆排序首先必选先构造大顶锥或小顶锥,只有这样的锥才有堆排序。首先先看什么是堆?ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2),当然,这是小根堆,大根堆则换成>=号。堆排序比较复杂,在另篇博客中叙述,期待一下吧!
归并排序
二路归并排序:
它是一种将两个有序表合并成一个有序表的排序方法。基本思想:假设序列中有n个记录,每个序列的长度为1。先将每相邻的两个记录合并,得到⌈n/2⌉个较大的有序的子序列,每个子序列包含2个记录,再将上述子序列两两合并,得到⌈⌈n/2⌉⌉个有序子序列,如此反复,指导整个序列有序为止。
总结
这次对算法是一次考后的总结,同时又是一次新的收获,对代码部分有了新的理解,先简单介绍了每种算法,让自己有一个整体的回顾。接下来还会针对自己比较模糊的几个算法再进行详细介绍,比如快速排序、堆排序相对来说要难一些,还需要好好再理解一下代码。