技术开发 频道

C/C++ 经典算法实例 二分查找的代码

  【IT168 技术】C/C++ 经典算法实例 二分查找的代码。

int bfind(int* a,int len,int val)
{
int m = len/2;
int l = 0;
int r = len;
while(l!=m && r!= m)
{
if(a[m] > val)
{
r
= m;
m
= (m+l)/2;
}
else if(a[m] < val)
{
l
= m;
m
= (m+r)/2;
}
else
return m;
}
return
-1;   //没有找到
}

  写出在母串中查找子串出现次数的代码。

int count1(char* str,char* s)
{
char
* s1;
char
* s2;
int count = 0;
while(*str!='\0')
{
s1
= str;
s2
= s;
while(*s2 == *s1&&(*s2!='\0')&&(*s1!='0'))
{
s2
++;
s1
++;
}
if(*s2 == '\0')
count++;
str
++;
}
return count;
}

   查找第一个匹配子串位置,如果返回的是s1长度len1表示没有找到。

size_t find(char* s1,char* s2)
{
size_t i
=0;
size_t len1
= strlen(s1)
size_t len2
= strlen(s2);
if(len1-len2<0) return len1;
for(;i        {
size_t m
= i;
for(size_t j=0;j            {
if(s1[m]!=s2[j])
break;
m
++;
}
if(j==len)
break;
}
return i    
}

   写出快速排序或者某种排序算法代码

  快速排序:

int partition(int* a,int l,int r)
{
int i=l-1,j=r,v=a[r];
while(1)
{
while(a[++i]        while(a[--j]>v) if(j<=i) break;
if(i>=j)
break;
swap(a[i],a[j]);
}
swap(a[i],a[r]);
return i;
}

void qsort(
int* a,int l,int r)
{
if(l>=r) return;
int i = partition(a,l,r);
qsort(a,l,i
-1);
qsort(a,i
+1,r);
}

   冒泡排序:

void buble(int *a,int n)
{
for(int i=0;i    {
for(int j=1;j        {
if(a[j]            {
int temp=a[j];
a[j]
= a[j-1];
a[j
-1] = temp;
}
}
}
}

   插入排序:

void insertsort(int* a,int n)
{
int key;
for(int j=1;j    {
key
= a[j];
for(int i=j-1;i>=0&&a[i]>key;i--)
{
a[i
+1] = a[i];
}
a[i
+1] = key;
}
}

   出现次数相当频繁

  实现strcmp函数:

int strcmp11(char* l,char* r)
{
assert(l!
=0&&r!=0);
while(*l == *r &&*l != '\0') l++,r++;
if(*l > *r)
return
1;
else if(*l == *r)
return
0;
return
-1;
}

   实现字符串翻转:

void reserve(char* str)
{
assert(str !
= NULL);
char
* p1 = str;
char
* p2 = str-1;
while(*++p2);         //一般要求不能使用strlen
p2
-= 1;
while(p1    {
char c
= *p1;
*p1++ = *p2;
*p2-- = c;
}
}

  将一个单链表逆序:

struct list_node
{
list_node(
int a,list_node* b):data(a),next(b) //这个为了测试方便
{}
int data;
list_node
* next;
};

void reserve(list_node
* phead)
{
list_node
* p = phead->next;
if(p == NULL || p->next == NULL) return; //只有头节点或一个节点
list_node
* p1=p->next;
p
->next=NULL;
while(p1!=NULL)
{
p
= p1->next;
p1
->next = phead->next;
phead
->next = p1;
p1
= p;
}
}
0
相关文章