第二章之“CheckSums”(練習2.3-7)

來源:互聯網
上載者:User

題目:請給出一個已耗用時間為O(nlgn)的演算法,使之能在給定一個由n個整數構成的集合S和另一個整數x時,判斷出S中是否存在有兩個其和等於x的元素。

思路:

輸入:數組a[1...n],待尋找整數v

輸出:若存在,輸出在數組a中找到的第一對加和等於v的兩個元素索引及其值。

首先採用合并排序演算法對數組進行從小到大排序(複雜度為O(nlgn))。

從左→右掃描數組a(時間複雜度為O(n)),對每個a[i],在數組中用二分尋找演算法尋找v-a[i](時間複雜度為O(lgn)),則總時間複雜度為O(nlgn)

#include <stdio.h>#include <string.h>#include <time.h>#define BUFFER_SIZE 10void Merge(int *a,int p,int q,int r){int n1=q-p+1;int n2=r-q;int b[n1];int c[n2];int n=n1+n2;int i=0;int j=0;int k=0;memset(b,0,sizeof(b));memset(c,0,sizeof(c));for(i=0;i<n1;i++){b[i]=a[i+p];}for(i=0;i<n2;i++){c[i]=a[i+q+1];}for(i=p,j=0,k=0;i<=r&&j<n1&&k<n2;i++){//注意i的初始值和結束值 if(b[j]<=c[k]){a[i]=b[j];j++;}else{a[i]=c[k];k++;}}if(j<n1){for(;i<=r&&j<n1;i++){a[i]=b[j];j++;}}else if(k<n2){for(;i<=r&&k<n2;i++){a[i]=c[k];k++;}}}  void MergeSort(int *a,int p,int r){int q=0;if(p>=r){return;}q=(p+r)/2;MergeSort(a,p,q);MergeSort(a,q+1,r);Merge(a,p,q,r);}void Output(int *a,int len){int i=0;for(i=0;i<len;i++){printf("%d ",a[i]);}printf("\n");}int BinarySearch(int *a,int p,int r,int v){int mid=0;if(p>r){return -1;}mid=(p+r)/2;if(v==a[mid]){return mid;}else if(v<a[mid]){return BinarySearch(a,p,mid-1,v);}else{return BinarySearch(a,mid+1,r,v);}}int CheckSums(int *a,int len,int p,int r,int v){int index=-1;int i=0;for(i=0;i<len;i++){index=BinarySearch(a,0,len-1,v-a[i]);if(index!=-1){printf("尋找到的第一對和等於%d的元素所在數組中的索引為:a[%d]=%d和a[%d]=%d\n",v,i,a[i],index,a[index]);return 1;}}return 0;}int main(){    int i=0;    int v=0;     int flag=0; int a[BUFFER_SIZE];memset(a,0,sizeof(a));srand((unsigned)time(NULL));for(i=0;i<BUFFER_SIZE;i++){a[i]=rand()%BUFFER_SIZE;}    printf("隨機產生的數組:"); Output(a,BUFFER_SIZE);//用合并排序使數組元素從小到大排序 MergeSort(a,0,BUFFER_SIZE-1);printf("從小到大排序後的數組:");Output(a,BUFFER_SIZE);v=rand()%(BUFFER_SIZE+5);printf("隨機產生待尋找元素v=%d\n",v);flag=CheckSums(a,BUFFER_SIZE,0,BUFFER_SIZE-1,v);if(flag==0){printf("數組中不存在和等於%d的兩個數\n",v);}system("pause");return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.