算法模板

选择

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;
}
posted @ 2020-01-28 21:32  pusidun  阅读(129)  评论(0编辑  收藏  举报