第十一章
关于排序函数
sort1中不断地给t赋相同的初始值,可以利用sot2的方法改进
#include<stdio.h>
void sort1() {
for(int i =1; i < n; i++) {
for(int j = i; j > 0 && x[j-1]>x[j]; j--) {
t = x[j];
x[j] = x[j-1];
x[j-1] = t;
}
}
}
void sort2() {
for (int i = 1; i < n; i++) {
t = x[i];
for (int j = i; j > 0 && x[j-1] > t; j--)
x[j] = x[j-1];
x[j] = t;
}
}
快速排序,堆排序,二分查找之前已经写过,这里就不写了。
文本中的单词个数统计,可用哈希或者STL中的map。
查找给定字符串中的最长重复子串,利用后缀数组。根据书上的例子实现的代码如下:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#include <algorithm>
#define MAXN 1024
char str[MAXN];
char *suffix[MAXN];
bool cmp(char *a, char *b) {
if (strcmp(a,b) < 0)
return 1;
return 0;
}
int comlen(char *a, char *b) {
int l1 = strlen(a);
int l2 = strlen(b);
int i = 0;
while (i < l1 && i < l2 && a[i] == b[i])
i++;
return i;
}
int main() {
int n = 0;
int i;
int maxl = 0;
scanf("%s", &str);
n = strlen(str);
for (i=0;i<n;i++)
suffix[i] = &str[i];
sort(suffix, suffix + n, cmp);
for (i=0;i<n;i++)
printf("%s\n", suffix[i]);
for (i=0;i<n-1;i++) {
if (comlen(suffix[i], suffix[i+1]) > maxl)
maxl = comlen(suffix[i], suffix[i+1]);
}
printf("%d\n", maxl);
return 0;
}