算法导论:练习2.3-7
来源:互联网 发布:十送红军网络歌手 编辑:程序博客网 时间:2024/05/16 08:19
判断整数集合s中是否有和为x的一对整数,且运行时间为nlgn.
第一步采用归并排序(快速排序也可)先将数组元素进行排序 运行时间为nlgn。
在数组两端设置两个指针,比较两指针之和与x的关系,若不等则移动某一指针,运行时间为n。
所以综上为nlgn.
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef int DataType;void MergePass(DataType A[],DataType TempA[],int n,int length);void MergeSort(DataType A[],int n);void Merge(DataType A[],DataType TempA[],int L,int R,int RightEnd);void MergeSort(DataType A[],int n){ int length,i; DataType *TempA; length= 1; TempA=malloc(sizeof(DataType)*n); if(TempA){ while(length<n) { MergePass(A,TempA,n,length); length*=2; MergePass(TempA,A,n,length); length*=2;; } free(TempA); } else printf("空间不足");}void merge(DataType A[],DataType TempA[],int L,int R,int RightEnd){ int k=L,NumArray,LeftEnd,i; LeftEnd=R-1; NumArray=RightEnd-L+1; while(R<=RightEnd&&L<=LeftEnd) { if(A[L]<=A[R]) TempA[k++]=A[L++]; else TempA[k++]=A[R++]; } while(L<=LeftEnd) TempA[k++]=A[L++]; while(R<=RightEnd)TempA[k++]=A[R++];}void MergePass(DataType A[],DataType TempA[],int n,int length){ int i,j; for(i=0;i<n-2*length;i+=length*2) merge(A,TempA,i,i+length,i+2*length-1); if(i+length<n) merge(A,TempA,i,i+length,n-1); else for(j=i;j<n;j++) TempA[j]=A[j];}int find(DataType a[],int rear,int head,int x){ while(head!=rear) { if(a[head]+a[rear]==x) return 1; else{ if(a[head]+a[rear]<x) head++; else rear--; } printf("%d %d\n",a[head],a[rear]); } return 0;}int main(){ int a[12]={5,4,2,7,1,9,0,12,15,11,10,-1}; int i; int x=9; MergeSort(a,12); for(i=0;i<12;i++) printf("%d ",a[i]); int rear=x-1,head=0; printf("\n%d",find(a,rear,head,x)); return 0;}
我想到的另外一个思路是先找到集合中的最大值和最小值,运行时间为n,再定义一个适当大小的数组a,先初始化为某个值,遍历整个数组 令a[|S1-x/2|]+=-1或者1,当为0时结束返回真,但是这个方法很不稳定,由于最大值和最小值的差不同可能会出现溢出,在理想情况下(即集合中元素相差不是特别大时)用此法非常简便
0 0
- 算法导论 练习 2.3-7
- 算法导论:练习2.3-7
- 算法导论 练习 2.3-1
- 算法导论 练习 2.3-2
- 算法导论 练习 2.3-3
- 算法导论 练习 2.3-4
- 算法导论 练习 2.3-5
- 算法导论 练习 2.3-6
- 算法导论 练习 2.1
- 算法导论 练习 2.2
- 算法导论 2.3-7
- 算法导论 2.3-7
- 算法导论2.3.7
- 算法导论2.3.7
- 算法导论2.3-7
- 《算法导论》练习28.1-5
- 算法导论练习 3.2-5
- 算法导论第二章算法练习
- ArcGIS教程:自定义地图范围(一)
- Jmeter+maven+Jenkins构建云性能测试平台(二)
- 检讨——2016年7月26日11:06:13
- js 字符串转换成数字的三种方法, 取float型小数点后两位数的方法
- ubuntu14.04安装opencv2.4.11
- 算法导论:练习2.3-7
- iOS开发--Swift语言1
- 自我营销与自我救赎
- #NOIP 2014# day.1 T3 飞扬的小鸟 bird
- get、post、ajax、getJSON四种请求方式
- event 事件
- android studio 快捷键
- html5--导航栏制作
- codeblocks网络编程不识别socket等