Java数据结构和算法 第二版 课后习题第三章

习题1、bubbleSort.java程序(清单3.1)和BubbleSort专题applet中,in索引变量都是从左到右移动的,直到找到最大数据项并把它移动到右边的out变量外。修改bubbleSort()方法,使它成为双向移动的。这样,in索引先像以前一样,将最大的数据项从左移到右,当它到达out变量位置时,它掉头并把最小的数据项从右移到左。需要两个外部索引变量,一个在右边(以前的out变量),另一个在左边。

public static void bubbleSort(int nElem,int [] source){
  int leftOut=0,rightOut=nElem-1,in;
  while(leftOut<=rightOut){
    for(in = leftOut;in<rightOut;in++){
      if(source[in]>source[in+1])
        swap(source,in,in+1);
    }
    for(in=rightOut-1;in>leftOut;in--){
      if(source[in]<source[in-1])
        swap(source, in, in-1);
    }
    ++leftOut;
    --rightOut;
    for(int i=0;i<nElem;i++)
      System.out.print(source[i]+",");
    System.out.println(" ");
}

习题3、在insertSort.java程序(清单3.3)中增加一个名为noDups()的方法,这个方法从已经有序的数组中删掉重复的数据项而不破坏有序性。(可以用insertionSort()方法对数据排序,或者也可以简单地用main()方法将数据有序地插入到表中。)一种解决方法是每发现一个重复的数据,就从这个位置开始到数组结尾都向前移动一个位置,但这样就导致消耗很长的 O(N2)的时间级,起码在有很多重复数据项的情况下是这样的。在设计的算法中,不论有多少重复数据,要确保数据项最多只能移动一次。这样算法只消耗O(N)数量级的时间。

public static int[] noDub(int[] source,int nElem){
  int[] result = new int[nElem];
  int j=0;

  for(int i=0;i<nElem-1;i++){
    if(source[i]!=source[i+1]){
      result[j] = source[i];
      ++j;
    }                                       //如果两个元素相等,则不做任何事,只是等待下一步将索引指向下一个,即插入的元素是相等的那几个元素中的最后一个元素
  }
  result[j]=source[nElem-1];         //最后一个元素在for循环中并没有进行处理,无论它与前面一个数相等或者不相等都应该被插入。
  return result;
}

习题4、还有一种简单排序算法是奇偶排序。它的思路是在数组中重复两趟扫描。第一趟扫描选择所有 的数据项对,a[j]和a[j+1],j是奇数(j=1,3,5,……)。如果它们的关键字的值次序颠倒,就交 换它们。第二趟扫描对所有的偶数数据项进行同样的操作(j=2,4,6,……)。重复进行这样两趟 的排序直到数组全部有序。用oddEvenSort()方法替换bubbleSort.java程序(清单3.1)中的 bubbleSort()方法。确保它可以在不同数据量的排序中运行,还需要算出两趟扫描的次数。奇 偶排序实际上在多处理器环境中很有用,处理器可以分别同时处理每一个奇数对,然后又同时 处理偶数对。因为奇数对是彼此独立的,每一对都可以用不同的处理器比较和交换。这样可以非 常快速地排序。

public static void oddEvenSort(int[] source,int nElem){

  boolean changed = true;

  while(changed){

    changed = false;

    for(int i=0;i<nElem;i=i+2){

      if(a[i] > a[i+2]){

        swap(i,i+2);

        changed = true;

      }

    }

    for(int i=1;i<nElem;i=i+2){

      if(a[i] > a[i+2]){

        swap(i,i+2);

        changed = true;

      }

    }

  }

}

习题5、修改insertSort.java程序(清单3.3)中的insertionSort()方法,使它可以计算排序过 程中复制和比较的次数并显示出总数。为计算比较的次数,要把内层while循环的两个条件分开。用这个程序测量各种数量的逆序数据排序的复制和比较次数。结果满足O(N2)吗?与已经基本有 序的数据(仅有很少的数据无序)的情况一样吗?从对基本有序数据排序的表现中可得出关于这 个算法效率的什么结论?

public static void insertionSort(int[] source,int nElem){
  int out,in;
  int compare=0,copy=0,temp;
  for(out=1;out<nElem;out++){
    temp = source[out];
    for(in = out;in>0;in--){
      if(source[in-1]>temp){
        source[in] = source[in-1];
        ++copy;
        ++compare;
      }
      else{
        ++compare;
        break;
      }
    }
    source[in] = temp;
  }
  for(int i=0;i<source.length;i++)
    System.out.print(source[i]+",");
  System.out.println(" ");
  System.out.println("compaer = "+compare+"copy = "+copy);
}

时间: 2024-10-27 11:59:56

Java数据结构和算法 第二版 课后习题第三章的相关文章

算法竞赛入门经典(刘汝佳)课后习题前三章答案

本文转载: 第一章习题1-1#include <stdio.h>int main(){int a,b,c;double d;scanf("%d%d%d",&a,&b,&c);d=(double)(a+b+c);printf("%.3lf\n",d/3.0);return 0;} 习题1-2#include <stdio.h>int main(){int f;double c;scanf("%d",&

JAVA语言程序设计基础课后习题第三章

//exercise 3.1 package thirdchapterexercise1; import java.util.Scanner; public class first { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in =new Scanner(System.in); System.out.print("Enter a,b,c:"); double

【读书笔记】周志华《机器学习》第三版课后习题讨&lt;第一章-绪论&gt;

虽然是绪论..但是...真的有点难!不管怎么说,一点点前进吧... 声明一下答案不一定正确,仅供参考,为本人的作答,希望大神们能多多指教~ 1.1 表1.1中若只包含编号为1和4的两个样例,试给出相应的版本空间. 解答:本题考查版本空间.假设空间的概念.简而言之,假设空间是该问题情景下,所有的取值可能性(包括单属性泛化.二属性泛化.X属性泛化--全泛化的情况),而版本空间则是指在测试用样本情境下,满足样本内所有正例的假设集合(一般版本空间内的假设都是带有属性泛化). 我们先来看一下1和4样例组成

java数据结构和算法06(红黑树)

这一篇我们来看看红黑树,首先说一下我啃红黑树的一点想法,刚开始的时候比较蒙,what?这到底是什么鬼啊?还有这种操作?有好久的时间我都缓不过来,直到我玩了两把王者之后回头一看,好像有点儿意思,所以有的时候碰到一个问题困扰了很久可以先让自己的头脑放松一下,哈哈! 不瞎扯咳,开始今天的正题: 前提:看红黑树之前一定要先会搜索二叉树 1.红黑树的概念 红黑树到底是个什么鬼呢?我最开始也在想这个问题,你说前面的搜索二叉树多牛,各种操作效率也不错,用起来很爽啊,为什么突然又冒出来了红黑树啊? 确实,搜索二

软件设计师教程第5版课后习题答案

软件设计师教程第5版课后答案 软件设计师教程第5版课后习题答案具体对比变化如下: 第4版 第5版 对比变化 第一章 计算机系统知识 第一章 计算机系统知识 无变化 第二章 程序设计语言基础 第二章 程序设计语言基础 无变化 第三章 操作系统知识 第四章 操作系统知识 第5版删减小节:网络与嵌入式操作系统.UNIX操作系统基础知识 第四章 软件工程基础知识 第五章 软件工程基础知识 第5版增加知识点:统一过程(UP)模型.webApp设计 增加小节:系统设计(概要设计和详细设计) 结构化开发方法独

计算机组成原理_第四版课后习题答案(完整版)

计算机组成原理_第四版课后习题答案(完整版) ?第一章 1.?比较数字计算机和模拟计算机的特点. 解:模拟计算机的特点:数值由连续量来表示,运算过程是连续的: 数字计算机的特点:数值由数字量(离散量)来表示,运算按位进行. 两者主要区别见P1?表1.1. 2.?数字计算机如何分类?分类的依据是什么? 解:分类: 数字计算机分为专用计算机和通用计算机.通用计算机又分为巨型机.大型机. 中型机.小型机.微型机和单片机六类. 分类依据:专用和通用是根据计算机的效率.速度.价格.运行的经济性和适应性来划

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有