选择
void selection(vector<int>& vec) {
if(vec.size() <= 1) return;
for(int i = 0; i<vec.size() - 1; ++i) {
int minidx = i;
for(int j = i + 1; j < vec.size(); ++j) {
if(vec[minidx] > vec[j])
minidx = j;
}
if(i != minidx) swap(vec[i], vec[minidx]);
}
}
冒泡
void bubbleSort(vector<int>& vec) {
bool isSorted = false;
for(int i = vec.size()-1; !isSorted && i>0; --i) {
isSorted = true;
for(int j = 0; j < i; ++j) {
if(vec[j] > vec[j+1]) {
isSorted = false;
swap(vec[j], vec[j+1]);
}
}
}
}
插入排序
void insertSort(vector<int>& vec) {
for(int i = 0; i<vec.size() -1 ; ++i) {
int j = i+1;
int tmp = vec[j];
while(vec[j-1] > tmp) {
vec[j] = vec[j-1];
--j;
}
vec[j] = tmp;
}
}
快速排序
/*
** quick sort array [lo, hi]
**/
void quick_sort(int a[], int lo, int hi) {
if(lo >= hi)
return;
int i = lo - 1, j = hi + 1, x = a[lo + hi >>1];
while(i < j) {
do i++; while(a[i] < x);
do j--; while(a[j] > x);
if(i < j) swap(a[i], a[j]);
}
quick_sort(a, lo, j);
quick_sort(a, j+1, hi);
}
归并排序
/*
** merge sort array [lo, hi]
*/
void merge_sort(int a[], int lo, int hi) {
if(lo >= hi) return;
int mid = lo + hi >> 1;
merge_sort(a, lo, mid);
merge_sort(a, mid+1, hi);
int i = lo, j = mid+1, k=0;
int* tmp = new int(hi-lo+1);
while(i<=mid && j<=hi) {
if(a[i] < a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
while(i<=mid)
tmp[k++] = a[i++];
while(j<=hi)
tmp[k++] = a[j++];
for(int m=0; m<hi-lo+1; m++) a[m] = tmp[m];
}
数据结构
字符串
KMP
vector<int> getNext(char s[], int len) {
int j = -1;
vector<int> next(len,0);
next[0] = -1;
for(int i=1; i<len; ++i) {
while( j != -1 && s[j+1] != s[i])
j = next[j];
if( s[j + 1] == s[i]) ++j;
//next[i] = j;
if( j == -1 || next[i+1] != next[j+1])
next[i] = j;
else
next[i] = next[j];
}
}
bool KMP(char text[], char pattern[]) {
int n = strlen(pattern);
vector<int> next = getNext(pattern, n);
int j = -1;
for(int i=0; i<strlen(text); ++i) {
while( j != -1 && text[i] != pattern[j+1])
j = next[j];
if(text[i] == pattern[j+1]) ++j;
if(j == n-1) return true;
}
return false;
}