Programación para determinar si hay dos números cuya suma es igual a un número k dado en una matriz que contiene una secuencia creciente.
La complejidad del tiempo O(nlogn) es mejor que O(N^2)
#include
#include
#define SUM_OK1
#define SUM_FAIL0
typedef struct _Pair{
int a;
int b ;
}Par;
Par ret estático;
int sum_binary_search( int * datas, int start, int len, int match )
{
int low =-1;
int pos = -1;
//Para facilitar la prueba, la longitud fija es 10 y la Los siguientes datos también son Puedes escribirlos primero
if (datas[7] //assert(datas[low] if (datas[low+4] //assert(datas[low] if (datas[low+2] //assert(datas[low] if (datas[low+1] //assert(datas[low]< coincidencia && datos[ low+1]>=match) pos = low+1; if (pos>10 || datos[pos]!=match) { pos = -1; } else{ ret.b = datos[pos]; } return pos; } int search_pair( int * datas, int suma, int len ) p> { int i; int retVal = SUM_FAIL; int *pair_datas = (int*)calloc(len,sizeof(int )); for (i = 0;i pair_datas[i] = suma -datas[i]; for ( i = 0;i< len;i++) //O(n) { ret.a = suma - pair_datas[i]; if (-1 != sum_binary_search (datas,0,len,pair_datas[i])) //O(lgn) { retVal = SUM_OK; printf("(% d,%d)\n",ret.a,ret.b); break;/-----------Si desea imprimir todos los resultados apropiados y eliminar este descanso, puede usar los parámetros de entrada para controlarlo usted mismo } } //-----> O(nlgn) free(pair_datas); pair_datas = NULL; regresar retVal; } int comparar(const void* a,const void* b){ int* t = (int*)a;int* s = (int*)b; return (*t-*s); } int main(){ int (*cmp)(const void*,const void*) = comparar; int datos[10] = {2,10,5,3,4,6,13,7,11, 9} ; int suma = 13; int len = 10; qsort(datas,len,sizeof(int),cmp); search_pair(datas,sum,len); devuelve EXIT_SUCCESS; }