1.P24 Insertion-Sort的第一行 for j ← 2 为什么 times是n次而不是n-1?
for j = 2 一直到 j = n由于j在这一过程中分别会被赋值2,3,4 ... n 到 j = n + 1时才不满足for循环的条件而跳出 循环,所以j = n + 1这个语句还是执行了,因此从2到n+1共 n 次。
2.Insertion Sort 的 C++实现?
- //插入排序,将元素非降序排列(非升序排列只要将while循环条件中
- //的key < arr[j]改成key > arr[j]即可)
- template<class T>
- void InsertionSort(T arr[], int n)
- {
- T key; //用了保存每次用于比较的值
- int j; //内层循环计数器
- //第一个数已经排好序了,因此i从1开始而不是从0开始
- for(int i = 1; i < n; ++i){
- //取得准备进行排序的元素
- key = arr[i];
- //j 是给key赋值元素的前一个
- j = i - 1;
- //这里要注意j的取值,j可以等于0,因为在key < arr[j]中j可以为0
- //表示key一直比较到第一个元素,这里确定j的取值有一个原则就是
- //key能够和数组的第一个元素进行比较!
- while(j >= 0 && key < arr[j]){
- //如果前面元素的值大,就让前面的元素值复制到后一个位置。
- arr[j + 1] = arr[j];
- --j;
- }
- //此处是arr[j+1]而非arr[j], 因为在退出循环时,j进行了自减
- arr[j + 1] = key;
- }
- }
3. SelectionSort的C++实现?
- template<class T>
- void SelectionSort(T arr[], int n)
- {
- T tmp; //用于交换的临时变量
- //最后一个元素用不着选了,
- //它必然是最大的,所以i只到n-1
- for(int i = 0; i < n - 1; ++i){
- int smallest = i;
- //选出最小的元素值的下标
- for(int j = i + 1; j < n; ++j){
- if(arr[j] < arr[smallest])
- smallest = j;
- }
- //交换最小元素和第i个元素,不能只
- //将arr[smallest]赋值给arr[i],而必须交换
- tmp = arr[smallest];
- arr[smallest] = arr[i];
- arr[i] = tmp;
- }
- }
4.Consider the problem of adding two n-bit binary integers, stored in two n-element arrays A and B. The sum of the two integers should be stored in binary form in an (n + 1)-element array C. State the problem formally and write pseudocode for adding the two integers.
伪代码实现:
BinaryAdd(A, B, C)
Begin:
flag = 0;
for i = 1 to n
key = A[i] + B[i] + flag
C[i] = key mod 2
if key > 1
flag = 1
else
flag = 0
if flag = 1
C[n+1] = 1
---END
C++实现:
- void BinaryAdd(int a[], int b[], int* c, int n)
- {
- int flag = 0; //进位标示符
- for(int i = 0; i < n; ++i){
- int key = a[i] + b[i] + flag;
- c[i] = key % 2;
- if(key > 1){
- flag = 1;
- }else{
- flag = 0; //这句不能少,少了flag在变成1之后就不能变成0了,一直是进位
- }
- }
- if(1 == flag)
- c[n] = 1;
- }
5.归并排序的内部堆栈是怎样运行的???
6.归并排序的C++实现?
- //辅助函数:对两个已经排好序的列进行归并
- template<class T>
- void Merge(T arr[], int low, int mid, int high)
- {
- T *tmpArray = new T[high - low + 1];
- int k = 0, i = low, j = mid + 1;
- while(i <= mid && j <= high){
- if(arr[i] < arr[j]){
- tmpArray[k++] = arr[i++];
- }else{
- tmpArray[k++] = arr[j++];
- }
- }
- while(i <= mid){
- tmpArray[k++] = arr[i++];
- }
- while(j <= high){
- tmpArray[k++] = arr[j++];
- }
- for(int i = 0, k = low; i <= high - low; i++, k++){
- arr[k] = tmpArray[i];
- }
- delete[]tmpArray;
- }
- //归并排序递归实现
- template<class T>
- void MergeSort(T arr[], int low, int high)
- {
- int mid;
- if(low < high){
- mid = (low + high) / 2;
- MergeSort(arr, low, mid);
- MergeSort(arr, mid+1, high);
- Merge(arr, low, mid, high);
- }
- }
- //带入数组(C/C++数组下标从0开始)
- template<class T>
- void MergeSortArray(T arr[], int n)
- {
- MergeSort(arr, 0, n - 1);
- }