3、两数之和

快速排序+二分查找:
 

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);				//递归调用右边部分排序
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章