算法导论(第三版)Exercises2.3

2.3-1:

3 9 26 38 41 49 52 59

3 26 41 52   9 38 49 57

3 41   52 26   38 57   9 49

3   41  52  26  38  57  9  49

2.3-2:(归并排序)

void mergeSort(int a[], int l, int r)
{
    int m;
    if(l < r)
    {
        m = (l + r) / 2;
        mergeSort(a, l, m);
        mergeSort(a, m+1, r);
        merge(a, l, r, m);
    }
}

void merge(int a[], int l, int r, int p)
{
    int i, j, k;
    int n1 = p - l + 1;
    int n2 = r - p;
    int lArray[n1], rArray[n2];

    for(i=0; i<n1; i++) lArray[i] = a[l+i];
    //for(i=0; i<n1; i++) printf(" %d ", lArray[i]);
    for(j=0; j<n2; j++) rArray[j] = a[p+j+1];
    //for(j=0; j<n2; j++) printf(" %d ", rArray[j]);
    i = 0;
    j = 0;
    for(k=l; k<=r; k++)
    {
        if(i < n1 && (j >= n2 || lArray[i] <= rArray[j]))
        {
            a[k] = lArray[i];
            ++i;
        }
        else if(j < n2 && (i >= n1 || rArray[j] < lArray[i]))
        {
            a[k] = rArray[j];
            ++j;
        }
    }
}

2.3-3:

n=2:  Tn=2lg2=2

假设 n=k时等式成立

Tk+1=2(Tk) + 2k+1=2 * (2k * k) + 2k+1=2k+1(k+1)

2.3-4:

最差情况:

1   n=2;

Tn = Tn-1+n-1;

2.3-5:(二分查找)

int binarySearch(int a[], int v, int n)
{
    int l, r, m;

    l = 0;
    r = n - 1;
    while(l <= r)
    {
        m = (l + r) / 2;
        if(v < a[m]) r = m - 1;
        else if(v > a[m]) l = m + 1;
        else return m;
    }
    return -1;
}

最差情况:

2   n=2;

Tn=T(n/2) + 1      n=2k;

θ(lgn)

2.3-6:

无法降低运行时间

2.3-7:(参考了网友的答案,做了一点优化,希望大家能提更好的改进建议)

算法:求一个N个数的集合是否含有和为X的2个元素(需要支持c99标准)

bool sumX(int a[], int n, int x)
{
    int length, complement[n];
    mergeSort(a, 0, n-1);
    length = deduplication(a, n);
    xComplement(a, complement, length, x);
    return mergeSearch(a, complement, length);
}

bool mergeSearch(int a[], int b[], int n)
{
    int i, j;
    for(i=0, j=n-1; i<n && j>=0 && a[i]!=b[j]; )
        if(a[i] < b[j]) i++;
        else j--;
    return i<n && j>=0;
}

void xComplement(int a[], int aComplement[], int n, int x)
{
    int i;
    for(i=0; i<n; i++) aComplement[i] = x - a[i];
}

int deduplication(int a[], int n)
{
    int i, tmp[n];
    int j = 0;
    for(i=0; i<n; i++)
    {
        if(i > 0 && a[i-1] != a[i]) j++;
        tmp[j] = a[i];
    }
    for(i=0; i<=j; i++) a[i] = tmp[i];
    return j+1;
}

void mergeSort(int a[], int l, int r)
{
    int m;
    if(l < r)
    {
        m = (l + r) / 2;
        mergeSort(a, l, m);
        mergeSort(a, m+1, r);
        merge(a, l, r, m);
    }
}

void merge(int a[], int l, int r, int m)
{
    int max = 1000;
    int i, j, k;
    int n1 = m - l + 1;
    int n2 = r - m;
    int lArray[n1+1], rArray[n2+1];

    for(i=0; i<n1; i++) lArray[i] = a[l+i];
    for(j=0; j<n2; j++) rArray[j] = a[m+j+1];
    lArray[n1] = max;
    rArray[n2] = max;
    i = 0;
    j = 0;
    for(k=l; k<=r; k++)
    {
        if(i < n1 && lArray[i] <= rArray[j])
        {
            a[k] = lArray[i];
            ++i;
        }
        else
        {
            a[k] = rArray[j];
            ++j;
        }
    }
}

θ(nlgn)

时间: 2024-10-21 03:10:24

算法导论(第三版)Exercises2.3的相关文章

算法导论 第三版 中文版

下载地址:网盘下载 算法导论 第三版 中文版 清晰 PDF,全书共8部分35章节,内容涵盖基础知识.排序和顺序统计量.数据结构.高级设计和分析技术.高级数据结构.图算法.算法问题选编.以及数学基础知识.非常实用的参考书和工程实践手册.此外,其他资源也已经上传,全部免费,欢迎大家下载! 第3版的主要变化 1.新增了van Emde Boas树和多线程算法,并且将矩阵基础移至附录. 2.修订了递归式(现在称为"分治策略")那一章的内容,更广泛地覆盖分治法. 3.移除两章很少讲授的内容:二项

字符串匹配算法的C语言实现-算法导论第三版(1)

因为最近准备开始学习做一些小的Android项目练手,看上了系统级的三个应用,拨号盘,通讯录和短信,准备从最简单的拨号做起,但是因为这些应用中都不可避免的会有自动提示,我觉得设计到的就是字符串匹配问题,这里准备使用C语言来实现,将来通过JNI集成到应用当中. 1.首先是朴素匹配,实际上就是穷举: 用C语言实现的函数我放到这里: 1 void naive_string_match(char *t,char *p){ 2 int n = strlen(t); 3 int m = strlen(p);

算法导论第三版 &nbsp; 练习2.2-2

选择算法  伪代码:  for j=1 to n-1    smallest = j    for i=j+1 to n      if  A[i]<A[smallest]          smallest=i    A[j]=A[smallest]     循环不变式 在for循环(循环变量为j)的每次 迭代开始,包含元素A[1..j-1]对的子数组都是排好序的(由数组[1..n]的j-1个最小元素组成) 循环终止的条件是就j>n-1,因为每次循环的迭代j增加1,所以必有j=n.将j=n带

算法导论 第三版 9.3-8

1 # -*- coding: utf-8 -*- 2 import math 3 4 def merge(l1, l2): 5 list_merge = [] 6 i = j = 0 7 while i < len(l1) and j < len(l2): 8 if l1[i] < l2[j]: 9 list_merge.append(l1[i]) 10 i += 1 11 else: 12 list_merge.append(l2[j]) 13 j += 1 14 if i == l

算法导论第三版 &nbsp; 练习2.3-5

二分查找伪代码:迭代 Binary-Search(A,low,high,x) while(low<=high)    mid=(low+high)/2  if(A[mid]==x)    return mid  else if (A[mid]>x)     high=mid-1  else       low=mid+1 return  null 二分查找伪代码:递归 Binary-Search(A,low,high,x) if(low>high)    return null mid=

算法导论第三版思考题8-2.e

1 COUNTING-SORT2(A,k) 2 let C[0..k] be a new array 3 for i = 0 to k 4 C[i]=0 5 for i = 1 to A.length 6 C[A[i]] = C[A[i]]+1 7 for i = 1 to k 8 C[i] = C[i] + C[i-1] 9 for i = A.length downto 1 10 while i < (j = C[A[i]) 11 exchagnge A[i] with A[j] 12 C[

算法导论 第三版 思考题 7-4

快速排序,尾递归.最坏情况下栈深度Θ(lgn) 1 import random 2 def patition(A, l, r): 3 j = l 4 key = A[r] 5 for i in range(l, r+1): 6 if A[i] < key: 7 temp = A[j] 8 A[j] = A[i] 9 A[i] = temp 10 j += 1 11 A[r] = A[j] 12 A[j] = key 13 return j 14 15 def quicksort(A, l, r)

算法导论第三版思考题8-3.b

SORT_PROBLEM_B(A) let m be the count of character set let B[0..m-1] be a new array for i = 0 to m-1 make B[i] an empty list for i = 1 to A.length k = A[i][0]-'a' C[i] = A[i][1...A[i].length] insert C[i] into list B[k] for i = 0 to m-1 SORT_PROBLEM_B(

算法导论(第三版)Problems2(归并插入排序、数列逆序计算)

讨论内容不说明,仅提供相应的程序. 2.1:归并插入排序θ(nlgn) void mergeInsertionSort(int a[], int l, int r, int k) { int m; if(r-l+1 > k) { m = (l + r) / 2; mergeInsertionSort(a, l, m, k); mergeInsertionSort(a, m+1, r, k); merge(a, l, m, r); } else if(l < r) insertSort(a, l