`
lighter
  • 浏览: 500964 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

重新温习数据结构一:数组

阅读更多

我对java基础和数据结构,算法学得好的人很佩服,毕竟无论什么时候,基础的学习才是最重要的.以前学过数据结构,现在重新温习一下.
数组分为有序数组与无序的数组,在一个无序数组中可以很快进行插入,花费O(1)时间,但查找与删除都速度比较慢O(n)时间;有序数组,查找很快O(1)时间花费,但插入却花费O(n)时间.
(本文的例子是摘<<data java="" in="" algorithms="" structures=""></data>>这一本书的)

下面看一个无序数组的例子

  1. package org.h2;   
  2.   
  3. /**  
  4.  * 这一个类是为说明数组在数据结构中的运用  
  5.  *   
  6.  * @author lighter  
  7.  *   
  8.  */  
  9. class HighArray {   
  10.  private long[] a; // 定义一个数组a   
  11.   
  12.  private int nElems; // 定义数组里面有多少项   
  13.   
  14.  // -----------------------------------------------------------   
  15.   
  16.  public HighArray(int max) // 构造方法   
  17.  {   
  18.   a = new long[max]; // 创建一个数组   
  19.   nElems = 0// 刚开始数组元素为空   
  20.  }   
  21.   
  22.  // -----------------------------------------------------------   
  23.  public boolean find(long searchKey) { // 寻找指定的值   
  24.   int j;   
  25.   for (j = 0; j < nElems; j++)   
  26.    if (a[j] == searchKey) // 找到元素?   
  27.     break;            // 退出循环   
  28.   if (j == nElems)   
  29.    return false;         // 没有在数组中找到元素   
  30.   else  
  31.    return true;          // 在数组中找到元素   
  32.  }   
  33.   
  34.  // -----------------------------------------------------------   
  35.   
  36.  public void insert(long value) // 增加一个元素到数组中去   
  37.  {   
  38.   a[nElems] = value;   
  39.   nElems++;   
  40.  }   
  41.   
  42.  // -----------------------------------------------------------   
  43.  public boolean delete(long value) {// 删除一个元素,先查找,找到则删除   
  44.   int j;   
  45.   for (j = 0; j < nElems; j++)   
  46.    if (value == a[j])   
  47.     break;   
  48.   if (j == nElems)   
  49.    return false;   
  50.   else {   
  51.    for (int k = j; k < nElems; k++)   
  52.     a[k] = a[k + 1];   
  53.    nElems--;   
  54.    return true;   
  55.   }   
  56.  }   
  57.   
  58.  // -----------------------------------------------------------   
  59.   
  60.  public void display() // 打印出数组的内容   
  61.  {   
  62.   for (int j = 0; j < nElems; j++)   
  63.    System.out.print(a[j] + " ");   
  64.   System.out.println("");   
  65.  }   
  66. }   
  67.   


注:find方法中的如下语句:  if (j == nElems)
   return false;         // 没有在数组中找到元素
  else
   return true;          // 在数组中找到元素
可以用这一条语句来替代return (j!=nElems);

再写一个类:

  1. package org.h2;   
  2.   
  3. class HighArrayApp   
  4. {   
  5. public static void main(String[] args)   
  6.    {   
  7.    int maxSize = 100;            // array size   
  8.    HighArray arr;                // reference to array   
  9.    arr = new HighArray(maxSize); // create the array   
  10.   
  11.    arr.insert(77);               // insert 10 items   
  12.    arr.insert(99);   
  13.    arr.insert(44);   
  14.    arr.insert(55);   
  15.    arr.insert(22);   
  16.    arr.insert(88);   
  17.    arr.insert(11);   
  18.    arr.insert(00);   
  19.    arr.insert(66);   
  20.    arr.insert(37);   
  21.   
  22.    arr.display();                // display items   
  23.   
  24.    int searchKey = 35;           // search for item   
  25.    if( arr.find(searchKey) )   
  26.       System.out.println("找到 " + searchKey);   
  27.    else  
  28.       System.out.println("不能找到" + searchKey);   
  29.   
  30.    arr.delete(00);               // delete 3 items   
  31.    arr.delete(55);   
  32.    arr.delete(99);   
  33.   
  34.    arr.display();                // display items again   
  35.    }  // end main()   
  36. }  // end class HighArrayApp   
  37.   


运行结果如下:
77 99 44 55 22 88 11 0 66 37
不能找到35
77 44 22 88 11 66 37

下面看一个有序数组的例子,比较上面的,看一下两者的不同之处

java 代码
  1. package org.h2;   
  2.   
  3. class OrderArray {   
  4.  private long[] a; // ref to array a   
  5.   
  6.  private int nElems; // number of data items   
  7.   
  8.  public OrderArray(int max) // constructor   
  9.  {   
  10.   a = new long[max]; // create array   
  11.   nElems = 0;   
  12.  }   
  13.   
  14.  public int size() {   
  15.   return nElems;   
  16.  }   
  17.   
  18. //这里采用二分查找的方法,速度比较快   
  19.  public int find(long searchKey) {   
  20.   int lowerBound = 0;   
  21.   int upperBound = nElems - 1;   
  22.   int curIn;   
  23.   
  24.   while (true) {   
  25.    curIn = (lowerBound + upperBound) / 2;   
  26.    if (a[curIn] == searchKey)   
  27.     return curIn;     // found it   
  28.    else if (lowerBound > upperBound)   
  29.     return nElems;    // can't find it   
  30.    else                  // divide range   
  31.    {   
  32.     if (a[curIn] < searchKey)   
  33.      lowerBound = curIn + 1// it's in upper half   
  34.     else  
  35.      upperBound = curIn - 1// it's in lower half   
  36.    }    
  37.   }     
  38.  }    
  39.   
  40.  public void insert(long value) // put element into array   
  41.  {   
  42.   int j;   
  43.   for (j = 0; j < nElems; j++)   
  44.    if (a[j] > value)      // (linear search)   
  45.     break;   
  46.   for (int k = nElems; k > j; k--)   
  47.    a[k] = a[k - 1];   
  48.   a[j] = value;             // insert it   
  49.   nElems++;                 // increment size   
  50.  }    
  51.   
  52.  public boolean delete(long value) {   
  53.   int j = find(value);   
  54.   if (j == nElems) // can't find it   
  55.    return false;   
  56.   else            // found it   
  57.   {   
  58.    for (int k = j; k < nElems; k++)   
  59.     a[k] = a[k + 1];   
  60.    nElems--;  // decrement size   
  61.    return true;   
  62.   }   
  63.  }   
  64.   
  65.  public void display() // displays array contents   
  66.  {   
  67.   for (int j = 0; j < nElems; j++)   
  68.    System.out.print(a[j] + " ");    
  69.   System.out.println("");   
  70.  }   
  71. }   
  72.   


再写一个实现类,测试一下测试结果如下:
Found 55
0 11 22 33 44 55 66 77 88 99
11 22 33 44 66 77 88

  1. package org.h2;   
  2.   
  3. class OrderArrayApp   
  4. {   
  5. public static void main(String[] args)   
  6.    {   
  7.    int maxSize = 100;             // array size   
  8.    OrderArray arr;                  // reference to array   
  9.    arr = new OrderArray(maxSize);   // create the array   
  10.   
  11.    arr.insert(77);                // insert 10 items   
  12.    arr.insert(99);   
  13.    arr.insert(44);   
  14.    arr.insert(55);   
  15.    arr.insert(22);   
  16.    arr.insert(88);   
  17.    arr.insert(11);   
  18.    arr.insert(00);   
  19.    arr.insert(66);   
  20.    arr.insert(33);   
  21.   
  22.    int searchKey = 55;            // search for item   
  23.    if( arr.find(searchKey) != arr.size() )   
  24.       System.out.println("Found " + searchKey);   
  25.    else  
  26.       System.out.println("Can't find " + searchKey);   
  27.   
  28.    arr.display();                 // display items   
  29.   
  30.    arr.delete(00);                // delete 3 items   
  31.    arr.delete(55);   
  32.    arr.delete(99);   
  33.   
  34.    arr.display();                 // display items again   
  35.    }  // end main()   
  36. }  // end class OrderedApp   
  37.   
  38.   




 

分享到:
评论
1 楼 YRHYRH 2007-07-16  
哈哈 姐姐好功力呀..

相关推荐

    C语言程序设计课本习题解答.pdf

    4. 数组和指针:数组是一种数据结构,可以存储多个相同类型的数据。指针是一种变量,存储的是内存地址。指针可以 用来访问数组中的元素。 5. 控制结构:控制结构包括顺序结构、选择结构、循环结构等。控制结构可以...

    算法参考资料2015CCPCNanyangOnsiteWarmup

    - 基础数据结构:数组、链表、栈、队列、树、图等。 - 常见算法:排序算法(如快速排序、归并排序、堆排序等),搜索算法(如深度优先搜索、广度优先搜索等)。 - 高级算法主题:动态规划、贪心算法、回溯算法、分治...

    dailyLearn:javascript,实现数据结构和算法题

    javascript实现数据结构题 使用javascript实现经典的数据结构面试题。练手和温习 水平有限,如有缺漏,望见谅! 文件结构: 1)ADT ———— 抽象数据类型(ADT) 包含:list(列表),llist(链表),queue(队列)...

    springmybatis

    所以在此重新温习了一下 mybatis, 因此就有了这个系列的 mybatis 教程. 什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果...

    边学边用c语言(新大陆内部学习资料)

    4. **数组和字符串**:数组是存储同类型元素集合的数据结构,而字符串是字符数组的特殊形式。学习如何处理数组,特别是字符串操作(如字符串复制、比较和查找),对于实际编程很有帮助。 5. **结构体与联合体**:...

    Java 8 编程实训指南与样例解析

    本文介绍了多个实用的 Java 编程实训题及其实现方式,内容覆盖基础语法(HelloWorld程序、变量、if/else等条件判断), 控制结构(for循环), 面向对象编程(类的创建,继承),以及基础数据结构(数组的操作). 它还包括了...

    C语言经典教程-重点

    理解它们的使用及内存布局,对理解和使用复杂数据结构有极大帮助。 5. **动态内存分配**:通过malloc和free函数,我们可以动态地分配和释放内存,这对于处理不确定大小的数据或避免浪费内存非常重要。 6. **文件...

    温习(基本等于重学)C语言的练习样例。.zip

    C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的...

    基于c语言成绩管理系统课程设计样本.doc

    学生在课程设计过程中,通过重新温习C语言和应用数据结构知识,提高了编程技能,学会了独立思考和解决问题。同时,也体验到了团队合作的重要性,增强了动手操作和问题解决的能力。在反思中,学生表示虽然遇到困难,...

    vue前四天学习知识的温习小项目---完成前源代码

    这个“vue前四天学习知识的温习小项目”旨在帮助初学者巩固在短时间内学习Vue.js的基本概念和技术。通过实际操作一个小项目,可以更好地理解和应用所学知识。 1. **Vue.js基本概念** - **Vue实例**:Vue应用程序的...

    软件设计师学习计划(谁都适用,很实用)

    在第四周,需要学习《软件设计官方教程【第5版】》第3章数据结构(线性结构、数组、矩阵和广义表和树三部分,对应前1-3个知识点)。数据结构是软件设计师考试的基础知识之一,需要掌握对应的线性结构的特点。上午的...

    贪吃蛇手机游戏代码和项目文档模板

    2. 数据结构与算法:如链表(或数组)实现蛇的身体,以及碰撞检测算法。 3. 图形编程:了解基本的2D图形绘制,如像素操作、坐标系统、帧率控制。 4. 用户输入处理:学习如何捕获和响应用户输入事件。 5. 时间管理:...

    C_in_Clg_FirstYear:第一年所有单元的C程序

    6. **数组与指针**:数组是相同类型元素的集合,而指针则存储内存地址,两者结合使用可以实现高效的数据处理。指针的使用是C语言的一大特点,也是其难点之一。 7. **结构体与联合**:结构体允许将不同类型的数据...

    C语言范例源程序

    4. **结构体与联合体**:C语言中的复合数据类型,如结构体和联合体,可以用来表示更复杂的数据结构。通过实例,你可以看到如何定义、初始化和操作这些结构。 5. **内存管理**:源代码可能包括动态内存分配(`malloc...

    C语言实敲代码c-language-practice-library-master.zip

    - **指针**:C语言的一个强大特性是支持指针,可以直接操作内存地址,进行高效的数据操作和复杂的数据结构实现。 - **预处理指令**:如#define用于常量定义,#include用于引入头文件,#ifdef/#ifndef用于条件编译...

    抢车位游戏

    停车位可以看作是一个数组或者链表,每个元素代表一个车位的状态(空闲或占用)。查找空车位的过程可能使用了线性搜索(遍历所有车位),如果车位数量较大,可能会优化为二分查找或者哈希映射来提高效率。此外,为了...

    零起点学通C++多媒体范例教学代码

    14.7.1 函数传参实例一——求数组所有元素的和 14.7.2 函数传参实例二——用递增法查找数据 14.7.3 函数传参实例三——用二分算法查找数据 14.7.4 函数传参实例四——判断数组是否按照顺序排列 14.7.5 函数传参实例...

    零起点学通C++学习_多媒体范例教学代码

    14.7.1 函数传参实例一——求数组所有元素的和 14.7.2 函数传参实例二——用递增法查找数据 14.7.3 函数传参实例三——用二分算法查找数据 14.7.4 函数传参实例四——判断数组是否按照顺序排列 14.7.5 函数传参...

    JS实现网页标题随机显示名人名言的方法

    数组是JavaScript中一种用于储存有序数据集合的数据结构。它允许我们以一种容易管理和访问的方式存储多个元素。在实现网页标题随机显示名言的场景中,我们将使用数组来存储所有的名人名言。 接下来是字符串(string)...

Global site tag (gtag.js) - Google Analytics