1. 插入排序
1.1 直接插入排序
void InsertSort ( ElemType A[ ] , int n)
{
int i, j;
for ( i = 2 ; i <= n; i++ )
{
if ( A[ i] < A[ i - 1 ] )
{
A[ 0 ] = A[ i] ;
for ( j = i - 1 ; A[ 0 ] < A[ j] ; -- j)
A[ j + 1 ] = A[ j] ;
A[ j + 1 ] = A[ 0 ] ;
}
}
}
1.2 折半插入排序
void MidInsertSort ( ElemType A[ ] , int n)
{
int i, j, low, high, mid;
for ( i = 2 ; i <= n; i++ )
{
A[ 0 ] = A[ i] ;
low = 1 ; high = i - 1 ;
while ( low <= high)
{
mid = ( low + high) / 2 ;
if ( A[ mid] > A[ 0 ] )
high = mid - 1 ;
else
low = mid + 1 ;
}
for ( j = i - 1 ; j >= high + 1 ; -- j)
A[ j + 1 ] = A[ j] ;
A[ high + 1 ] = A[ 0 ] ;
}
}
1.3 希尔排序
void ShellSort ( ElemType A[ ] , int n)
{
int dk, i, j;
for ( dk = n / 2 ; dk >= 1 ; dk = dk / 2 )
{
for ( i = dk + 1 ; i <= n; ++ i)
{
if ( A[ i] < A[ i - dk] )
{
A[ 0 ] = A[ i] ;
for ( j = i - dk; j > 0 && A[ 0 ] < A[ j] ; j = j - dk)
A[ j + dk] = A[ j] ;
A[ j + dk] = A[ 0 ] ;
}
}
}
}
1.4 总程序
# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
typedef int ElemType;
typedef struct {
ElemType* elem;
int TableLen;
} SSTable;
void ST_Init ( SSTable& ST, int len)
{
ST. TableLen = len + 1 ;
ST. elem = ( ElemType* ) malloc ( sizeof ( ElemType) * ST. TableLen) ;
int i;
srand ( time ( NULL ) ) ;
for ( i = 0 ; i < ST. TableLen; i++ )
{
ST. elem[ i] = rand ( ) % 100 ;
}
}
void ST_print ( SSTable ST)
{
for ( int i = 0 ; i < ST. TableLen; i++ )
{
printf ( "%3d" , ST. elem[ i] ) ;
}
printf ( "\n" ) ;
}
void InsertSort ( ElemType A[ ] , int n)
{
int i, j;
for ( i = 2 ; i <= n; i++ )
{
if ( A[ i] < A[ i - 1 ] )
{
A[ 0 ] = A[ i] ;
for ( j = i - 1 ; A[ 0 ] < A[ j] ; -- j)
A[ j + 1 ] = A[ j] ;
A[ j + 1 ] = A[ 0 ] ;
}
}
}
void MidInsertSort ( ElemType A[ ] , int n)
{
int i, j, low, high, mid;
for ( i = 2 ; i <= n; i++ )
{
A[ 0 ] = A[ i] ;
low = 1 ; high = i - 1 ;
while ( low <= high)
{
mid = ( low + high) / 2 ;
if ( A[ mid] > A[ 0 ] )
high = mid - 1 ;
else
low = mid + 1 ;
}
for ( j = i - 1 ; j >= high + 1 ; -- j)
A[ j + 1 ] = A[ j] ;
A[ high + 1 ] = A[ 0 ] ;
}
}
void ShellSort ( ElemType A[ ] , int n)
{
int dk, i, j;
for ( dk = n / 2 ; dk >= 1 ; dk = dk / 2 )
{
for ( i = dk + 1 ; i <= n; ++ i)
{
if ( A[ i] < A[ i - dk] )
{
A[ 0 ] = A[ i] ;
for ( j = i - dk; j > 0 && A[ 0 ] < A[ j] ; j = j - dk)
A[ j + dk] = A[ j] ;
A[ j + dk] = A[ 0 ] ;
}
}
}
}
int main ( )
{
SSTable ST;
ST_Init ( ST, 10 ) ;
ST_print ( ST) ;
InsertSort ( ST. elem, 10 ) ;
ST_print ( ST) ;
system ( "pause" ) ;
}
1.5 冒泡排序&快速排序
# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <string.h>
typedef int ElemType;
typedef struct
{
ElemType* elem;
int TableLen;
} SSTable;
void ST_Init ( SSTable& ST, int len)
{
ST. TableLen = len;
ST. elem = ( ElemType* ) malloc ( sizeof ( ElemType) * ST. TableLen) ;
int i;
srand ( time ( NULL ) ) ;
for ( i = 0 ; i < ST. TableLen; i++ )
{
ST. elem[ i] = rand ( ) % 100 ;
}
}
void ST_print ( SSTable ST)
{
for ( int i = 0 ; i < ST. TableLen; i++ )
{
printf ( "%d " , ST. elem[ i] ) ;
}
}
void swap ( ElemType& a, ElemType& b)
{
ElemType tmp;
tmp = a;
a = b;
b = tmp;
}
void BubbleSort ( ElemType A[ ] , int n)
{
int i, j;
bool flag;
for ( i = 0 ; i < n- 1 ; i++ )
{
flag = false ;
for ( j = n - 1 ; j > i ; j-- )
{
if ( A[ j - 1 ] > A[ j] )
{
swap ( A[ j - 1 ] , A[ j] ) ;
flag = true ;
}
}
if ( false == flag)
{
return ;
}
}
}
int Partition1 ( int * arr, int left, int right)
{
int k, i;
k = i = left;
for ( i < right; i++ ; )
{
if ( arr[ i] < arr[ right] )
{
swap ( arr[ i] , arr[ k] ) ;
k++ ;
}
}
swap ( arr[ k] , arr[ right] ) ;
return k;
}
int Partition2 ( ElemType A[ ] , int low, int high)
{
ElemType pivot = A[ low] ;
while ( low < high)
{
while ( low < high && A[ high] >= pivot)
-- high;
A[ low] = A[ high] ;
while ( low < high && A[ low] <= pivot)
++ low;
A[ high] = A[ low] ;
}
A[ low] = pivot;
return low;
}
void QuickSort ( ElemType A[ ] , int low, int high)
{
if ( low < high)
{
int pivotpos = Partition1 ( A, low, high) ;
QuickSort ( A, low, pivotpos - 1 ) ;
QuickSort ( A, pivotpos + 1 , high) ;
}
}
int main ( )
{
SSTable ST;
ElemType A[ 10 ] = { 64 , 94 , 95 , 79 , 69 , 84 , 18 , 22 , 12 , 78 } ;
ST_Init ( ST, 10 ) ;
memcpy ( ST. elem, A, sizeof ( A) ) ;
ST_print ( ST) ;
BubbleSort ( ST. elem, 10 ) ;
QuickSort ( ST. elem, 0 , 9 ) ;
ST_print ( ST) ;
system ( "pause" ) ;
}
2. 哈希查找
# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
# include <stdlib.h>
# define MaxKey 1000
int hash ( const char * key)
{
int h = 0 , g;
while ( * key)
{
h = ( h << 4 ) + * key++ ;
g = h & 0xf0000000 ;
if ( g)
{
h ^= g >> 24 ;
}
h &= ~ g;
}
return h % MaxKey;
}
int main ( )
{
const char * pStr[ 5 ] = { "xiongda" , "lele" , "hanmeimei" , "wangdao" , "fenghua" } ;
int i;
const char * pHash_table[ MaxKey] = { NULL } ;
for ( i = 0 ; i < 5 ; i++ )
{
printf ( "%s is key = %d\n" , pStr[ i] , hash ( pStr[ i] ) ) ;
pHash_table[ hash ( pStr[ i] ) ] = pStr[ i] ;
}
return 0 ;
}
3. KMP-字符串匹配模式
next数组
# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
typedef char * SString;
int Index ( SString S, SString T)
{
int i = 1 , j = 1 ;
while ( i <= S[ 0 ] && j <= T[ 0 ] )
{
if ( S[ i] == T[ i] )
{
++ i, ++ j;
}
else
{
i = i - j + 2 ;
j = 1 ;
}
}
if ( j > T[ 0 ] ) return i - T[ 0 ] ;
}
void get_next ( char T[ ] , int next[ ] )
{
int i = 1 ;
next[ 1 ] = 0 ;
int j = 0 ;
while ( i < T[ 0 ] )
{
if ( j == 0 || T[ i] == T[ j] )
{
++ i;
++ j;
next[ i] = j;
}
else
{
j = next[ j] ;
}
}
}
int KMP ( char S[ ] , char T[ ] , int next[ ] , int pos)
{
int i = pos;
int j = 1 ;
while ( i <= S[ 0 ] && j <= T[ 0 ] )
{
if ( j == 0 || S[ i] == T[ j] )
{
++ i;
++ j;
}
else
{
j = next[ j] ;
}
}
if ( j > T[ 0 ] )
{
return i - T[ 0 ] ;
}
else
return 0 ;
}
int main ( )
{
char S[ 256 ] ;
char T[ 10 ] ;
int next[ 10 ] ;
int pos;
S[ 0 ] = strlen ( "abcabaaabaabcac" ) ;
strcpy ( S + 1 , "abcabaaabaabcac" ) ;
T[ 0 ] = strlen ( "abaabcac" ) ;
strcpy ( T + 1 , "abaabcac" ) ;
pos = Index ( S, T) ;
if ( pos)
{
printf ( "匹配成功,位置为%d\n" , pos) ;
}
else
{
printf ( "未匹配\n" ) ;
}
get_next ( T, next) ;
pos = KMP ( S, T, next, 1 ) ;
if ( pos)
{
printf ( "匹配成功,位置为%d\n" , pos) ;
}
else
{
printf ( "未匹配\n" ) ;
}
}