快速排序+二分查找:
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); //遞歸調用右邊部分排序
}
}