算法导论:练习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
原创粉丝点击