快速排序+二分查找:
typedef struct NumsArray{ //两元素比较函数
int val;
int idx;
}NumsArray;
int compare(const void *p1,const void *p2)
{
return ((NumsArray*)p1)->val- ((NumsArray*)p2)->val;
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int *result = (int *)malloc(sizeof(int)*2);
*returnSize = 0;
NumsArray *arr_tmp = (NumsArray *)malloc(numsSize*sizeof(NumsArray));
for(int i = 0;i < numsSize;i++)
{
arr_tmp[i].val = nums[i];
arr_tmp[i].idx = i;
}
qsort(arr_tmp,numsSize,sizeof(arr_tmp[0]),compare); //快速排序
for(int i = 0;i < numsSize; i++)
{
NumsArray key = {.val = target - arr_tmp[i].val};
NumsArray *iteam = bsearch(&key,&arr_tmp[i+1],numsSize-1-i,sizeof(arr_tmp[0]),compare); //二分查找
if(iteam){
result[0] = arr_tmp[i].idx;
result[1] = iteam->idx;
*returnSize = 2;
break;
}
}
return result;
}
涉及到的C库函数:
需要使用系统函数:
(排序)
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
base:指向排序数组的第一个元素的指针;
nitems:由base所指向的数组元素的个数;
size:数组中每个元素的大小,以字节为单位;
compar:用来比较两个元素的函数
(二分查找)
void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))
key---指向要查找的元素的指针,类型转换为void*;
base---指向进行查找的数组的第一个对象的指针,类型转换为void*;
nitems---base所指向的数组元素的个数
size---数组中每个元素的大小
compare---用来比较两个元素的函数
int compare(const void *p1,const void *p2);
返回值小于0,p1所指向的元素会被排在p2所指向的元素的前面;
快速排序:
void quick_sort_all(int s[],int l,int r)
{
if(l < r)
{
int i = l,j = r,x = s[l]; //s[l]赋值给x,制造新的坑位
while(i < j)
{
while(i < j && s[j] >= x) //从右向左找一个小于X的数
j--;
if(i < j)
s[i++] = s[j]; //将这个数填补到之前的坑位,j位置形成新的坑位
//i++下次从i的下一位开始判定,避免重复判定增加时间
while(i < j && s[i] < x) //从左向右找一个大于X的数
i++;
if(i < j)
s[j--] = s[i]; //将这个数填补到上个空的坑位,i位置形成空的坑位
//j—下次从j的前一位开始判定,避免重复判定增加时间
}
s[i] = x; //将最后留出的空位用最开始的X填满,一趟排序完成
quick_sort_all(s,l,i-1); //递归调用左边部分排序
quick_sort_all(s,i+1,r); //递归调用右边部分排序
}
}