排序
- 归并排序
- 选择排序
归并排序
对俩个有序数组进行合并
将a,b数组中下标相同的数进行比较,较小的数放入c数组中并且下标值+1;全部比较完后,哪个数组有多的数就全放c数组后边去
void merge(int *a,int m,int *b,int n) //传入a,b数组和他们的长度
{
int i,j,k;
i=0;
j=0;
k=0;
while(i<m&&j<n) //当有一个数组中的数全部排完时停止
{
//将a[i]和b[j]进行比较
if(a[i]<=b[j])
{
//将a[i]收入c[k];
c[k]=a[i];
k++;
i++;
}
else
{
//将b[j]收入c[k];
c[k]=b[j];
k++;
j++;
}
//a数组元素没取完
if(i<m){
while(i<m)
{
c[k]=a[i];
k++;
i++;
}
}
//b数组元素没取完
else{
while(j<n)
{
c[k]=b[j];
k++;
j++;
}
}
}
}
选择排序
在数中找出最小的数并将它排在最前面,然后再从剩下的数中找出最小的数并排第二位,依次类推。
int min=0;int t=0;
for(int i=0;i<length-1-1;i++){
min=i;
for(int j=i+1;j<length;j++)
{
if(a[min]>a[j])
{
t=a[min];a[min]=a[j];a[j]=t;
}
}
if(min!=i)
{
t=a[i];a[i]=a[min];a[min]=t;
}
}
kmp算法(一点理解)
为了简便字符串的匹配,从而产生了kmp算法
最简单的方法是让子串的第一个数对齐主串中第一个数,若子串中的数与主串中的数不是一一匹配,则子串的第一个数对齐下一数,(思路简单但耗时)
eg:主串:abcdefg
子串:abcdex
能够发现当子串中第一个数与主串中第一个数匹配时,前几个数都匹配,但g与x不匹配,kmp算法就是子串中a字符与后边的字符不相等,而这后边的字符又与主串中那些字符匹配,所以子串中的a字符不与主串中后边那些不与a相等但匹配成功的数相等,因此,子串中a字符下次直接就与主串中的g字符进行匹配,这样就能减少时间
eg:
主串:abcababca
子串:abcabx
因为子串中前面的ab与后面的ab相等,所以在匹配时,前面的ab匹配成功,后面的ab也匹配成功,因此,若子串与主串匹配失败,则子串下次开始匹配的位置就是子串后边ab匹配的位置;
顺序结构和链式结构的区别:
顺序结构是在一块空间中找一个位置开始按顺序排放元素,物理上和逻辑上都是有顺序的:
链式结构就是在一块空间里随意放置元素,但你能根据这个元素找出下一个元素的位置(指针),在物理上是无序的,但在逻辑上是有序的,适用于元素的插入和删除,