算法导论练习2.3-7 (很有意思的一道题有两种方法)

题目是:描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素

思路:首先对该数组进行排序,因为运行时间O(nlgn)我选择了归并排序。归并排序的合并函数在《算法导论练习2.3-2和2.3-3》中有提到。然后排序的时候利用递归就可以实现了。源码会在下面展示出来。

对于程序的后半部分查找求和。有两种思路,一种是利用二分查找去实现。二分查找也是O(nlgn)的复杂度,所以符合本题的条件。但是我用的是从两端向里进行求和,最坏的情况下也是O(n)的复杂度,比二分查找更快一些。以下是源码。

#include <stdio.h>
//#include "mergeSort.h"
//#include "merge.h"

void myMerge(int arr[], int p, int q, int r)
{
    int n1 = q - p + 1;
    int n2 = r - q;
    int left[n1];
    int right[n2];

    for (int i = 0; i < n1; i++)
    {
        left[i] = arr[i + p - 1];
    }
    for (int j = 0; j < n2; j++)
    {
        right[j] = arr[j + q];
    }

    int i = 0;
    int j = 0;
    int k = p - 1;
    while (i != n1 && j != n2)
    {
        if (left[i] < right[j])
        {
            arr[k] = left[i];
            i++;
        }
        else
        {
            arr[k] = right[j];
            j++;
        }
        k++;
    }
    if (i == n1)
    {
        while (j < n2)
        {
            arr[k] = right[j];
            j++;
            k++;
        }
    }
    else
    {
        while (i < n1)
        {
            arr[k] = left[i];
            i++;
            k++;
        }
    }
}

void myMergeSort(int arr[], int start, int end)
{
    if (start < end)
    {
        int middle = (start + end) / 2;
        myMergeSort(arr, start, middle);
        myMergeSort(arr, middle + 1, end);
        myMerge(arr, start, middle, end);
    }
}

int main()
{
    int arr[10] = {1, 2, 4, 5, 32, 5, 3, 5, 4, 2};
    //进行归并排序 O(nlgn)
    myMergeSort(arr, 1, 10);
    //进行从两端向中间求和并寻找 最坏情况下的复杂度 O(n)

    int i = 0;
    int j = 9;
    while (i < j)
    {
        if (arr[i] + arr[j] == 37)
        {
            printf("存在两个数和37,这两个数为%d和%d", arr[i], arr[j]);
            return 1;
        }
        if (arr[i] + arr[j] < 37)
        {
            i++;
        }
        if (arr[i] + arr[j] > 37)
        {
            j--;
        }
    }
    printf("不存在两个数和37。");
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 683评论 0 0
  • 《斯坦福监狱实验》,根据真实发生的斯坦福监狱实验改编的同名电影,观影的每一秒都很难受,是一次极不舒服的观影体验,却...
    文长长阅读 8,843评论 84 168
  • 缘来则聚,缘灭则散 缘浅不遇见,缘深来相遇 戒妒,你只看到别人成功, 未看到别人匠心 戒骄 人外有人,天外...
    雅nmmm阅读 163评论 0 0
  • 我亲爱的朋友:不知道此时的你正在做什么。或正风雨无阻地在外头浪;或正在午休,醒来还有一堆事要做;或因为这鬼天气,啥...
    Syuer雪儿阅读 4,154评论 0 2