#include <stdio.h>
#include <windows.h>
#include <string.h>
char *StrSort(char *pStrSrc);
int CharBinSearch(const char *pStrSrc, char chFind);
int main()
{
char pStr[] = "qwertyuiopasdfg1234567890hjklzxcvbnm";
int i, nFind = 0;
DWORD dwTick = GetTickCount();
StrSort(pStr);
for (i = 0; i < 10000; i++)
nFind = CharBinSearch(pStr, 'a');
printf("Search : %s : %c : %d\nTime : %d\n", pStr, 'a', nFind, GetTickCount() - dwTick);
return 0;
}
// 功能: 折半查找一个字符(不考虑重复的字符,只要找到就行)
// 返回: 找到就返回下标,没找到返回-1
// 评分标准: 最容易看懂, 代码最短, 速度最快
int CharBinSearch(const char *pStrSrc, char chFind)
{
int nFind = -1;
// 添加你的代码
int low = 0,larger,mid;
if ((pStrSrc != NULL) && (nFind != '\0'))
{
larger = strlen(pStrSrc);//获取字符串长度
while (larger >= low)
{
mid = (low + larger) / 2;//得到中点下标
if (pStrSrc[mid] == chFind)//每次都是跟中点值比较
{
nFind = mid;
break;
}
else if (pStrSrc[mid] > chFind)//字符小于中点字符则在下半部分
larger = mid - 1;
else
low = mid + 1;
}
}
return nFind;
}
// 功能: 字符串排序(从小到大)
// 返回: 将pStrSrc返回
char *StrSort(char *pStrSrc)//高效排序算法,减少数据交换次数
{
int i, j, nLen = 0, nlow;
char chTemp;
if (pStrSrc != NULL)
{
nLen = strlen(pStrSrc);
for (i = 0; i < nLen - 1; i++) //从第一位到倒数第二位
{
for (nlow = i, j = i + 1; j < nLen; j++)
{
if (pStrSrc[j] < pStrSrc[nlow])//如果小于则交换下标
nlow = j;//即找出一次循环中最小值的下标
}
if (nlow != i) //如果找到的最小值下标不是自己,
{ //则交换数据,这样减少了数据的交换
chTemp = pStrSrc[i];
pStrSrc[i] = pStrSrc[nlow];
pStrSrc[nlow] = chTemp;
}
}
}
return pStrSrc;
}