2.3-系列习题总结
来源:互联网 发布:ping ip加端口 编辑:程序博客网 时间:2024/04/27 05:18
(待补全)
2.3-2
#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;void merge(int A[], int p, int q, int r)//归并排序{int i,j,k;int n1,n2;n1 = q - p + 1;n2 = r - q;int *L = new int[n1];int *R = new int[n2];for(i = 0; i < n1; i++)L[i] = A[p + i];//测试代码for(i = 0; i < n1; i++)cout<<L[i]<<" ";cout<<endl;//for(j = 0; j < n2; j++)R[j] = A[q + 1 + j];//测试代码for(j = 0; j < n2; j++)cout<<R[j]<<" ";cout<<endl;//i = j = 0;for(k = p; k <= r; k++){if( i != n1 && j != n2 && L[i] <= R[j]){A[k] = L[i]; i++;}else if(i != n1 && j != n2 && L[i] > R[j]){A[k] = R[j];j++;}else if(i == n1){A[k] = R[j];j++;}else if(j == n2){A[k] = L[i]; i++;}}delete[] L;delete[] R;}void main(){int A[] = {3,26,41,52,9,38,49,57};merge(A, 0, 3, 7);for(int i = 0; i< 8; i++)cout<<A[i]<<" ";}
2.3-4
#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;void insert_sort(int A[], int length){int i;int key;if(length > 1){insert_sort(A, length - 1);i = length - 2;key = A[length - 1];while(i >= 0 && key < A[i]){A[i + 1] = A[i];i--;}A[i + 1] = key;}}void main(){int A[] = {31, 41, 59, 26, 41, 58};insert_sort(A, 6);for(int i = 0; i < 6; i++)cout<<A[i]<<" ";}
2.3-5
// stdafx.cpp : 只包括标准包含文件的源文件// jj.pch 将作为预编译头// stdafx.obj 将包含预编译类型信息#include "stdafx.h"#include<iostream>// TODO: 在 STDAFX.H 中// 引用任何所需的附加头文件,而不是在此文件中引用using namespace std;void binary_search(int v, int A[], int lowbound, int uperbound){int midkey = (lowbound + uperbound) / 2;if((A[midkey] > v) && lowbound != midkey)binary_search(v, A, lowbound, midkey);else if(A[midkey] < v && uperbound != midkey+1) binary_search(v, A, midkey + 1, uperbound);else if (A[midkey] == v)cout<<midkey;else if(lowbound == midkey && A[midkey] == v) //一定要考虑边界情况cout<<lowbound;else if(uperbound == midkey + 1 && A[midkey + 1] == v)cout<<uperbound;else //lowbound = middlekeycout<<"NIL";}void main(){int A[]={ 21, 23, 45, 78,90};binary_search(45, A, 0, 4);}
补:写完这段代码后,又参看了一下答案中的伪代码,觉得自己写的这段代码太没有美感了,那么多if,else,有好几个可以合并的。周末在家又新写了一个比较好一点的,并纠正了两个拼写错误的单词lower,upper:
void binary_search(int v, int A[], int lower, int upper){if(lower < upper){int midpoint = (lower + upper) / 2;if(A[midpoint] > v)binary_search(v, A, lower, midpoint - 1);else if(A[midpoint] < v)binary_search(v, A, midpoint + 1, upper);elsecout<<midpoint;}else{if(A[lower] == v)cout<< lower;elsecout<<"NIL";}}
2.3-6使用二分法搜索插入位置的insert-sort
#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;int binary_search(int key, int A[], int lower, int upper) //输出应该插入的位置的下标,原数组中从这个下标起,到数组的最后一个元素都要依次向后移一位。{if(lower < upper && lower + 1 != upper) //数组中不止有两个元素{int midpoint = (lower + upper) / 2;if(A[midpoint] > key)binary_search(key, A, lower, midpoint - 1);else if(A[midpoint] < key)binary_search(key, A, midpoint + 1, upper);elsereturn midpoint + 1;}else if(lower < upper && lower + 1 == upper) //数组中只有2个元素{if(A[lower] < key && key < upper)return lower + 1;else if(key <= A[lower])return lower;elsereturn upper + 1;}else //数组中只有1个元素{if(key <= A[lower])return lower;elsereturn lower + 1;}}void insert_sort(int A[], int length){int i;if(length > 1){insert_sort(A, length - 1);int key = A[length - 1];int insert_index = binary_search(key, A, 0,length - 2);for(i = length - 1; i >= insert_index; i--)A[i] = A[i - 1]; A[insert_index] = key;}}void main(){int A[] = {31, 41, 59, 26, 41, 58, 4};insert_sort(A, 7);for(int i = 0; i < 7; i++)cout<<A[i]<<" ";}虽然使用了二分查找,但是运行时间是
虽然使用了二分查找,但是运行时间为NlgN吗?计算方法参看《introduction to algorithms 3rd》page83:4.3,4.4,4.5:如何计算递归耗时(solving recurrences)
2.3-7
#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;void merge(int A[], int p, int q, int r){int length1 = q - p + 1;int length2 = r - q;int *L = new int[length1];int *R = new int[length2];int i,j;for(i = 0; i < length1; i++)L[i] = A[p + i];for(i = 0; i < length2; i++)R[i] = A[q + i + 1];i = j = 0;while(p <= r){if(i < length1 && j <= length2){if(L[i] < R[j])A[p++] = L[i++];else A[p++] = R[j++];}else if(i == length1)A[p++] = R[j++];elseA[p++] = L[i++];}delete[] L;delete[] R;}void merge_sort(int A[], int p, int r){if(p < r){int q = (p + r) / 2;merge_sort(A, p, q);merge_sort(A, q + 1, r);merge(A, p, q, r);}}bool search_between(int x, int A[], int n1, int lower, int upper){bool exist = false;if(lower == upper){if(A[n1] + A[lower] == x)exist = true;}else //lower < upper{if(A[n1] + A[lower] == x)exist = true;else if(A[n1] + A[upper] == x)exist = true;else{int midpoint = (lower + upper) / 2;if(A[n1] + A[midpoint] < x)search_between(x, A, n1, midpoint + 1, upper);else if(A[n1] + A[midpoint] > x)search_between(x, A, n1, lower, midpoint); //边界问题要处理好,如果midpoint == lower,midpoint - 1就超界了。else exist = true;}}return exist;}void search(int x, int A[], int length){int i;bool exist = false;for(i = 0; i < length - 2; i++){exist = search_between(x, A, i, i + 1, length - 1);if(exist){cout<<"exist";break;}}if(!exist)cout<<"doesn't exist";}void main(){int A[] = {31, 41, 59, 26, 41, 58, 9};merge_sort(A, 0, 6);search(45, A, 7);}
0 0
- 2.3-系列习题总结
- 习题系列
- 习题总结
- sl/sql习题总结
- 考试习题总结
- 习题的总结
- 习题总结 5.29 night
- 习题总结 5.30 pm
- 习题总结(一)
- 树状数组习题总结
- 2.1-4习题总结
- JAVA习题总结
- 动态规划习题总结
- wustoj 习题总结
- 优化MySchool总结习题
- 操作系统习题总结
- 背包习题总结
- 前端习题总结
- 退出ssh继续执行命令
- 添加一个能够自适应字数的UILabel对象到ScrollView
- cocos2d-x酱油笔记之获取系统时间
- 一些好用的Linux命令工具
- 怎样获得软件的版本信息
- 2.3-系列习题总结
- GreenPlum改变表的分布策略
- 拷贝string至输出流
- RAC修改数据库的spfile位置
- html中的块元素(block element)和内联元素(inline element)
- C#中winform窗体常用设置
- 传智学习日志篇:五
- asihttprequest old了,用afnetworking把!
- 使用git管理远程仓库