1、希尔排序
#include <iostream>
using namespace std;
#define ARRAY_LEN 10
/*
* \brief 希尔排序
*/
int ShellSort(int* data, int len);
/*
* \brief 显示数组
*/
void ShowArray(int* data, int len, const char* pLog);
int main()
{
int nArray[ARRAY_LEN] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
ShowArray(nArray, ARRAY_LEN, "原始数组数据:");
ShellSort(nArray, ARRAY_LEN);
ShowArray(nArray, ARRAY_LEN, "希尔排序后 :");
return 0;
}
int ShellSort(int* data, int len)
{
if (nullptr == data || len <= 0)
return -1;
int gap = 0;
int i = 0, j = 0;
//分组
for (gap = len / 2; gap >= 1; gap /= 2) {
//每组排序
for (i = gap; i < len; i++) {
//组内排序
int temp = data[i];
for (j = i - gap; j >= 0 && temp < data[j]; j -= gap) {
data[j + gap] = data[j];
}
data[j + gap] = temp;
}
}
return 0;
}
void ShowArray(int* data, int len, const char* pLog)
{
if (nullptr == data || len <= 0)
return;
cout << pLog << " ";
for (int i = 0; i < len; i++) {
cout << data[i] << " ";
}
cout << endl;
}
2、快速排序
#include <iostream>
using namespace std;
#define ARRAY_LEN 10
/*
* \brief 快速排序
*/
int QuickSort(int* data, int len);
/*
* \biref 排序
*/
void Sort(int* data, int left, int right);
/*
* \brief 显示数组
*/
void ShowArray(int* data, int len, const char* pLog);
int main()
{
int nArray[ARRAY_LEN] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
ShowArray(nArray, ARRAY_LEN, "原始数组数据:");
QuickSort(nArray, ARRAY_LEN);
ShowArray(nArray, ARRAY_LEN, "快速排序后 :");
return 0;
}
int QuickSort(int* data, int len)
{
Sort(data, 0, len-1);
return 0;
}
void Sort(int* data, int left, int right)
{
if (nullptr == data || left >= right)
return;
int i = left;
int j = right;
int key = data[left];
while (i < j) {
while (i < j && data[j] > key) {
j--;
}
data[i] = data[j];
while (i < j && data[i] <= key) {
i++;
}
data[j] = data[i];
}
//循环结束条件 i == j
data[i] = key;
Sort(data, left, i-1);
Sort(data, i+1, right);
}
void ShowArray(int* data, int len, const char* pLog)
{
if (nullptr == data || len <= 0)
return;
cout << pLog << " ";
for (int i = 0; i < len; i++) {
cout << data[i] << " ";
}
cout << endl;
}
3、KMP算法
#include <iostream>
using namespace std;
/*
* \brief 求next数组
* \param pattern模式
* \param next数组
*/
void make_next(const char* pattern, int* next);
/*
* \brief Kmp算法
* \param text文本
* \param pattern模式
*/
int Kmp(const char* text, const char* pattern);
int main()
{
const char* text = "abcabcabcabcabcd";
const char* pattern = "abcabcd";
int nPos = Kmp(text, pattern);
cout << text << "与" << pattern;
cout << " 匹配位置是 " << nPos << endl;
return 0;
}
void make_next(const char* pattern, int* next)
{
if (nullptr == pattern || nullptr == next)
return;
int len = strlen(pattern);
next[0] = 0;
for (int k = 0, q = 1; q < len; q++) {
while (k > 0 && pattern[k] != pattern[q]) {
k = next[k - 1];
}
if (pattern[k] == pattern[q]) {
k++;
}
next[q] = k;
}
}
int Kmp(const char* text, const char* pattern)
{
int next[1024] = { 0 };
make_next(pattern, next);
int n = strlen(text);
int m = strlen(pattern);
for (int i = 0, q = 0; i < n; i++) {
while (q > 0 && text[i] != pattern[q]) {
q = next[q - 1];
}
if (text[i] == pattern[q]) {
q++;
}
if (q == m) {
return i - q + 1;
}
}
return -1;
}