高效排序与折半查找

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东皇※太一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值