首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

判断序列中是不是存在两个元素之和为x,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现

2013-10-24 
判断序列中是否存在两个元素之和为x,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现#include stdio.h#

判断序列中是否存在两个元素之和为x,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现

#include <stdio.h>#include <stdbool.h>bool binarySearch(int* a, int L, int N){int fI = 0, lI = L-1, mI = 0;while(fI <= lI){mI = (fI+lI) >> 1;if(N > *(a+mI))fI = mI + 1;else if(N < *(a+mI))lI = mI - 1;elsereturn true;}return false;}bool search(int* a, int L, int N){int i = 0;for (;i<L-1;i++){if(binarySearch(a, L, N-(*(a+i))))return true;}return false;}int binarySort(int* a, int fI, int lI, int N){int mI = (fI+lI) >> 1;if (N > *(a+mI)){fI = mI + 1;if(fI > lI)return mI+1;binarySort(a, fI, lI, N);}else if (N < *(a+mI)){lI = mI - 1;if(fI > lI)return mI;binarySort(a, fI, lI, N);}elsereturn mI+1;}void insertSort(int* a, int index, int N){int key = *(a+index);if(index+1 <= N){int i = binarySort(a, 0, index-1, key);int j = index-1;for (;j>=i;j--){*(a+j+1) = *(a+j);}*(a+i) = key;insertSort(a, index+1, N);}return;}int main(){int a[10] = {212,343,534,2,3,67,34,78,90,32};int L = sizeof(a)/sizeof(int);int i = 0;int x = 5360;insertSort(a, 1, L);for (;i<L;i++)printf("%d ",*(a+i));printf("\n");if(search(a, L, x))printf("Yes! \n");else printf("No! \n");return 0;}

热点排行