快速排序,希尔排序以及KMP字符查找算法

#include<stdio.h>
void quicksort(int arr[], int left, int right)//快速排序
{
int low = left;
int high = right;
int temp = arr[left];//挖第一个坑
if (left > right)//递归出口
{
return;
}
while (low != high)
{
for (; low<high&&arr[high]>temp; high--){}
if (low < high)
{
arr[low++] = arr[high];//满足条件填左边的坑同时又在右边挖一个坑
}
for (; low < high&&arr[low] < temp; low++){}
if (low < high)
{
arr[high--] = arr[low];//又满足条件填右边的坑同时又给左边挖一个坑
}
}
arr[high] = temp;//当左右指针相同,吧最开始挖出来的东西填在这个坑
quicksort(arr, left, high - 1);//左半部
quicksort(arr, high + 1, right);//右半部
}
void xiersort(int arr[], int len)//希尔排序
{
int gap;
for (gap = len / 2; gap > 0; gap /= 2)//确定步长.分成gap个组,分别进行插入排序
{
for (int i = gap; i < len; ++i)
{
for (int j = i - gap; j >= 0 && arr[j]>arr[j + gap]; j -= gap)//插入排序
{
arr[j] ^= arr[j + gap];
arr[j + gap] ^= arr[j];
arr[j] ^= arr[j + gap];
}
}
}
}
void GetNext(char *str, int nextval[])//优化版next数组,直接跳过相同的
{
unsigned int i = 0;
int j = -1;
nextval[0] = -1;
while (i < strlen(str))
{
if (j == -1 || str[i] == str[j])
{
i++;
j++;
nextval[i] = j;
}
else
j = nextval[j];//这里有个疑问为啥不能是-1?有没有什么特例
/* j = -1;*/
}
}
void GetNext2(char *str, int nextval[])//优化版next数组,直接跳过相同的
{
unsigned int i = 0;
int j = -1;
nextval[0] = -1;
while (i < strlen(str))
{
if (j == -1 || str[i] == str[j])
{
i++;
j++;
nextval[i] = j;
}
else
/* j = nextval[j];*/
j = -1;
}
}
int Kmp(char *str1, char *str2)//kmp算法
{
int i = 0;
int  j = 0;
int* nextval = (int*)calloc(100, sizeof(int));
int lenstr1 = strlen(str1);
int lenstr2 = strlen(str2);
GetNext(str2, nextval);
while ((i < lenstr1) && (j < lenstr2))
{
if (j == -1 || str1[i] == str2[j])
{
i++;
j++;
}
else
j = nextval[j];
if (j == lenstr2 || j == lenstr1)
{
free(nextval);
return i - lenstr2;
}
}
free(nextval);
return -1;
}                                                                                                                                                                                                                                         
int main()
{


char a = '\72';
printf("%d\n", sizeof(a));
int* nextval = (int*)calloc(100, sizeof(int));
int* nextval2= (int*)calloc(100, sizeof(int));
char str[15] = "aaaaaaaaaaa";
GetNext(str, nextval);
for (int i = 0; i < 17; ++i)
{
printf("%d  ", nextval[i]);
}
putchar('\n');
char str2[15] = "aaaaaaaaaaaaa";
GetNext2(str2, nextval2);
for (int i = 0; i < 17; ++i)
{
printf("%d  ", nextval2[i]);
}
free(nextval);
free(nextval2);
getchar();
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值