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);				//遞歸調用右邊部分排序
    }
}

 

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