主要包括四个文件main.c /GetNumOfKey.c/GetNumOfKey.h/Makefile
/*************************************************************************
> File Name: main.c
> Author: cyf
> Mail: XXXX@qq.com
> Created Time: 2016年03月24日 星期四 09时41分09秒
************************************************************************/
#include "GetNumOfKey.h"
/*
* 统计一个数字在排序数组中出现的次数
* 从数组开头开始对数组进行遍历,时间复杂度为O(n);
* 利用二分查找找到数组中要查找的数字的第一次出现的位置和最后一次出现的位置。
int main()
{
int Test[NUMSIZE] = {
1,2,3,3,3,3,4,5
};
int FindKey = 3;
int result = GetNumOfKey(Test, NUMSIZE, FindKey);
printf("the number of %d is %d\n", FindKey, result);
return 0;
}
/*************************************************************************
> File Name: GetNumOfKey.c
> Author: cyf
> Mail: XXXX@qq.com
> Created Time: 2016年03月24日 星期四 09时23分12秒
************************************************************************/
#include "GetNumOfKey.h"
/*
* 得到数组中第一个查找的数字的下标
* */
int GetFirstKey(int *data, int length, int k, int start, int end)
{
if(start > end)
return -1;
int middle = (start+end)>>1;
int middledata = data[middle];
if(middledata == k)
{
if((middle>0 && (data[middle-1]!=k)) || (middle == 0))
return middle;
else
end = middle-1;
}
else if(middledata < k)
start = middle+1;
else
end = middle-1;
return GetFirstKey(data, length, k, start, end);
}
/*
* 得到数组中最后一个查找的数字的下标
* */
int GetLastKey(int *data, int length, int k, int start, int end)
{
if(start > end)
return -1;
int middle = (start + end)>>1;
int middledata = data[middle];
if(middledata == k)
{
if(((middle < length-1)&&(data[middle+1]!=k))||(middle == length-1))
return middle;
else
start = middle+1;
}
else if(middledata < k)
start = middle+1;
else
end = middle-1;
return GetLastKey(data, length, k, start, end);
}
/*
* 得到数组中要查找数字的个数
* */
int GetNumOfKey(int *data, int length, int k)
{
int number = 0;
if(data!=NULL && length >0)
{
int first = GetFirstKey(data, length, k, 0, length-1);
int last = GetLastKey(data, length, k, 0, length-1);
if(first > -1 && last > -1)
number = last-first+1;
}
return number;
}
/*************************************************************************
> File Name: GetNumOfKey.h
> Author: cyf
> Mail: XXXX@qq.com
> Created Time: 2016年03月24日 星期四 09时22分49秒
************************************************************************/
#ifndef GETNUMOFKEY_H
#define GETNUMOFKEY_H
#include <stdio.h>
#include <stdlib.h>
#define NUMSIZE 8
int GetFirstKey(int *data, int length, int k, int start, int end);
int GetLastKey(int *data,int length, int k, int start, int end);
int GetNumOfKey(int *data, int length, int k);
#endif
CC = gcc
CFLAGS = -g
%.o:%.c
$(CC) -o $@ -c $(CFLAGS) $<
main:main.o GetNumOfKey.o
$(CC) main.o GetNumOfKey.o -o main $(CFLAGS)
clean:
rm -rf *.o main