“《编程珠玑》(第2版)第一章”:课后习题

  1. 如果不缺内存,如何使用一个具有库的语言来实现一种排序算法表示和排序集合?

  1)可以使用C语言中的快速排序qsort(参考自cplusplus),具体代码如下:

 1 /* qsort example */
 2 #include <stdio.h>      /* printf */
 3 #include <stdlib.h>     /* qsort */
 4
 5 int values[] = { 40, 10, 100, 90, 20, 25 };
 6
 7 int compare(const void * a, const void * b)
 8 {
 9     return (*(int*)a - *(int*)b);
10 }
11
12 int main()
13 {
14     int n;
15     qsort(values, 6, sizeof(int), compare);
16     for (n = 0; n < 6; n++)
17         printf("%d ", values[n]);
18     return 0;
19 }

qsort

  关于qsort,有一篇博文写的不错,可以参考。

  2)可以使用C++标准模板库函数sort(参考自cplusplus),具体代码如下:

 1 // sort algorithm example
 2 #include <iostream>     // std::cout
 3 #include <algorithm>    // std::sort
 4 #include <vector>       // std::vector
 5
 6 bool myfunction(int i, int j) { return (i < j); }
 7
 8 struct myclass {
 9     bool operator() (int i, int j) { return (i < j); }
10 } myobject;
11
12 int main() {
13     int myints[] = { 32, 71, 12, 45, 26, 80, 53, 33 };
14     std::vector<int> myvector(myints, myints + 8);               // 32 71 12 45 26 80 53 33
15
16     // using default comparison (operator <):
17     std::sort(myvector.begin(), myvector.begin() + 4);           //(12 32 45 71)26 80 53 33
18
19     // using function as comp
20     std::sort(myvector.begin() + 4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
21
22     // using object as comp
23     std::sort(myvector.begin(), myvector.end(), myobject);        //(12 26 32 33 45 53 71 80)
24
25     // print out content:
26     std::cout << "myvector contains:";
27     for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
28         std::cout << ‘ ‘ << *it;
29     std::cout << ‘\n‘;
30
31     return 0;
32 }

sort

  3)可以利用C++标准模板库容器set来完成相同的功能:

  摘自一篇博文对set容器的简介:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。可以使用中序遍历(用迭代器)将键值按照从小到大遍历出来。

  关于set容器更详细的介绍请参照cplusplus

  具体代码如下:

 1 #include <iostream>
 2 #include <set>
 3 using namespace std;
 4
 5 int main()
 6 {
 7     int myints[] = { 65, 23, 75, 42, 13 };
 8     set<int> myset(myints, myints + 5);    // use ‘set‘ member function ‘insert‘ is also ok.
 9
10     set<int>::iterator itr = myset.begin();
11     for (; itr != myset.end(); itr++)
12     {
13         cout << *itr << " ";    // 13, 23, 42, 65, 75
14     }
15
16     return 0;
17 }

set

  

时间: 2024-10-11 06:44:56

“《编程珠玑》(第2版)第一章”:课后习题的相关文章

第一章课后习题1.6

1.6 编写带有下列声明的例程: public void permute(String str); private void permute(char[] str, int low, int high); 第一个例程是个驱动程序,它调用第二个例程并显示String str中的字符的所有排列.例如,str是"abc", 那么输出的串则是abc,acb,bac,bca,cab,cba,第二个例程使用递归. package com.algorithm.chapterone; /** * 编写

谭浩强 c++程序设计第一章课后习题 第7题

#include <iostream> using namespace std; int main() { int a,b,c; int f(int x,int y,int z);//这是函数的声明 //cin sonsole控制台 cout<<"请输入三个整数类型的数字:" <<endl; cin>>a>>b>>c; c=f(a,b,c);//abc有具体值,称为实际参数 cout<<c<<

谭浩强 c++程序设计第一章课后习题 第10题

#include <iostream> using namespace std; int main() { int a,b,c; cout<<"请输入三个整数类型的数字:" <<endl; cin>>a>>b>>c; void sort(int x,int y,int z); sort(a,b,c);//abc有具体值,称为实际参数 return 0; } void sort(int x,int y,int z)/

第一章课后习题

1-1:数据压缩的一个基本问题是“我们要压缩什么”,对此你是怎么理解的? 答:数据压缩,就是指不丢失有用信息的前提下,以最少的数码表示信号源所发的信号,减少容纳给定消息集合或数据采样集合的信号空间. 1-2:数据压缩的另一个基本问题是“为什么进行压缩”,对此你是怎么理解的? 答:因为多媒体技术所处理的对象包括图像.视频和声音等多种媒体.它们的数据量非常大. 如果不进行数据压缩传输和存储都难以实用化.而经过数据压缩可以将一些占用内存比较 大多媒体数据,压缩成可以缩小的文件内存,这样可以方便传递,节

第一章 课后习题 10

1 #include <iostream> 2 using namespace std; 3 int main() 4 { void sort(int x,int y,int z); 5 int x,y,z; 6 cin>>x>>y>>z; 7 sort(x,y,z); 8 return 0; 9 } 10 void sort(int x,int y,int z) 11 { 12 int temp; 13 if(x>y) {temp=x;x=y;y=t

第一章 课后习题 7

1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a,b,c; 6 int f(int x,int y,int z); 7 cin>>a>>b>>c; 8 c=f(a,b,c); 9 cout<<c<<endl; 10 return 0; 11 } 12 int f(int x,int y,int z) 13 { 14 int m; 15 if(x&l

第一章课后习题1.5

1.5 编写一种递归方法,它返回数N的二进制中表示1的个数.利用这样一个事实:N为奇数,其1的个数为N/2的二进制中1的个数加1. package com.algorithm.chapterone; /** * 编写一种递归方法,它返回数N的二进制中表示1的个数.利用这样一个事实:N为奇数,其1的个数为N/2的二进制中1的个数加1. * @author Gao·Rongzheng * */ public class QuestionFour { public static void main(S

《计算机网络&amp;#183;自顶向下方法》第七版 第三章 课后习题与问题 答案

非官方答案,本人已尽最大努力(包括参考官方答案),使结果正确,如有错误,请大佬指出 正文: 3.1~3.3节 R1 a.如果只是简单想把信件送到,那么所有的头部信息只需要一个目的地址就够了,题目给出端口号四个字节,所有分组的头部那就只需四个字节 此协议规定,运输层的全部任务就是,将应用层的数据,切成最大1196字节的块,把每一块加上目的主机对应程序的端口号,并将得到的分组交付给网络层 在接收方,运输层将网络层报文取回,去掉头部信息,将数据拼接成应用层需要的信息,根据端口号交付给应用层即可 不过话

Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

第一章 Thread导论 为何要用Thread ? 非阻塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Task) 并行算法 第二章 Thread的创建与管理 一.什么是Thread ? Thread是所在主机执行的应用程序任务(task). 只有一个线程的例子: public class Factorial { public static void main(String[] args) { int n = 5; System.ou

C Primer Plus 第十二章课后习题……2015.5.10

第十二章课后习题 1.自动存储 寄存器存储 静态空连接 2.静态空连接 内部链接 外部链接 3.静态外部链接  静态内部链接 4.空连接 5.在声明中使用表面这个变量或函数已经定义过 6.都分配一个具有100个int值的数组,calloc还把每个元素设置为零. 7.daisy全局变量  lily局部变量 8.#include<stdio.h> char color='B'; void first(void); void second(void); int main(void) { extern