java面向对象的有序数组和无序数组的比较

package aa;
class Array{
    //定义一个有序数组
    private long[] a;
    //定义数组长度
    private int nElems;
    //构造函数初始化
    public Array(int max){
        a = new long[max];
        nElems = 0;
    }
    //size函数
    public int size(){
        return nElems;
    }
    //定义添加函数
    public void insert(long value){
        //将value赋值给数组成员
        a[nElems] = value;
        //然后将数组长度加一
        nElems ++;
        long temp;
        //用冒泡法排序
        for(int i = 0; i < nElems - 1; i ++)
        {
            for(int j = 0; j < nElems - 1 - i; j++)
            {
                if(a[j] > a[j + 1])
                {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
    }
    //定义查找方法
    public int find(long searchKey){
        //因为是有序数组,我们可以用二分法来查找时间为 O(logN),如果线性查找则为O(N)

        //下限
        int lowerBound = 0;
        //上限
        int upperBound = nElems -1;
        //中间值
        int curIndex;

        while(true)
        {
            curIndex = (lowerBound + upperBound) / 2;
            if(a[curIndex] == searchKey)
            {
                return curIndex;
            }
            else if(lowerBound > upperBound)
            {
                return nElems;
            }
            else
            {
                if(a[curIndex] > searchKey)
                {
                    upperBound = curIndex -1;
                }
                else
                {
                    lowerBound = curIndex + 1;
                }

            }
        }

    }
    //定义删除方法
    public boolean delete(long value){
        int index = find(value);
        if(index == size())
        {
            return false;
        }
        else
        {
            for(int i = index; i < size(); i++)
            {
                a[i] = a[i + 1];
            }
            nElems --;
            return false;
        }
    }
    //定义显示方法
    public void display(){
        for(int j = 0; j < nElems; j++)
        {
            System.out.println(a[j] + " ");
        }
        System.out.println("");
    }

}
public class Arr {
    public static void main(String[] args)
    {
        int maxSize = 100;
        Array arr = new Array(maxSize);
        arr.insert(77);
        arr.insert(99);
        arr.insert(44);
        arr.insert(55);
        arr.insert(22);
        arr.insert(88);
        arr.insert(11);
        arr.insert(22);
        arr.insert(66);
        arr.insert(33);
        arr.display();
        int searchKey = 54;
        if(arr.find(searchKey) != arr.size())
        {
            System.out.println("found" + searchKey);
        }
        else
        {
            System.out.println("cant find" + searchKey);
        }

        arr.delete(22);
        arr.delete(55);
        arr.delete(99);

        arr.display();
    }
}
package aa;
//定义一个无序数组
class HighArray{
    private long[] a;
    private int nElems;

    public HighArray(int max)
    {
        a = new long[max];
        nElems = 0;
    }

    public boolean find(long searchKey)
    {
        int j;
        for(j = 0; j < nElems; j++)
        {
            if(a[j] == searchKey)
            {
                break;
            }
        }
        if(j == nElems)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    public void insert(long value)
    {
        a[nElems] = value;
        nElems++;
    }

    public boolean delete(long value)
    {
        int j;
        for(j = 0; j < nElems; j++)
        {
            if(value == a[j])
            {
                break;
            }

        }
        if(j == nElems)
        {
            return false;
        }
        else
        {
            for(int k = j; k < nElems; k++)
            {
                a[k] = a[k+1];
            }
            nElems --;
            return true;

        }
    }
    public void display()
    {
        for(int j = 0; j < nElems; j++)
        {
            System.out.println(a[j] + "");
        }
        System.out.println("");
    }
}
public class highArrayApp {
    public static void main(String[] args)
    {
        int maxSize = 100;
        HighArray arr = new HighArray(maxSize);

        arr.insert(77);
        arr.insert(99);
        arr.insert(44);
        arr.insert(55);
        arr.insert(22);
        arr.insert(88);
        arr.insert(11);
        arr.insert(00);
        arr.insert(66);
        arr.insert(33);

        arr.display();

        int searchKey = 35;

        if(arr.find(searchKey))
        {
            System.out.println("Found" + searchKey);
        }
        else
        {
            System.out.println("cant find" + searchKey);

        }
        arr.delete(00);
        arr.delete(55);
        arr.delete(99);

        arr.display();
    }
}

大O表示法

  O(1):优秀。例如无须数组插入。

  O(logN):良好。例如有序的二分查找。

  O(N):及格。例如无序数组的删除,有序数组的删除和插入,线性查找。

  O(N2):不及格。例如冒泡排序。

总结有序数组和无序数组

  有序数组:插入+ 查找 +删除 = O(N) +O(logN)+O(N);

  无序数组:插入 + 查找 + 删除 = O(1) + O(N) + O(N);

  所以在数据偏向查找操作的时候用有序数组快一些,在数据偏向插入的时候,无序数组好一些。删除操作效率一样。

时间: 2024-11-09 00:20:36

java面向对象的有序数组和无序数组的比较的相关文章

为什么处理有序数组比无序数组快?

有兴趣学习教流c/c++的小伙伴可以加群:941636044 问题 由于某些怪异的原因,下面这段C++代码表现的异乎寻常--当这段代码作用于有序数据时其速度可以提高将近6倍,这真是令人惊奇. #include <algorithm> #include <ctime> #include <iostream> int _tmain (int argc , _TCHAR * argv []) { //Generate data const unsigned arraySize

为什么有序数组比无序数组快呢?

来自stackoverflow的题目Why is processing a sorted array faster than an unsorted array? Here is a piece of C++ code that seems very peculiar. For some strange reason, sorting the data miraculously makes the code almost six times faster: #include <algorithm

数组结构之数组

数据结构之数组的运用,无非是增删查操作,就有序数组和无序数组进行这三种操作: 一.查找 (1)无序数组查找特定元素,线性查找: 1 public static void unSortSearchKey(int arr[], int key) { 2 for (int i = 0; i < arr.length; i++) { 3 if(arr[i]==key){ 4 System.out.println(key+"在无序数组中索引为的"+i+"个位置"); 5

有序和无序数组的二分搜索算法

题目意思 1.给定有序数组A和关键字key,判断A中是否存在key,如果存在则返回下标值,不存在则返回-1. 2.给定无序数组A和关键字key,判断A中是否存在key,如果存在则返回1,不存在则返回0. 对于1.2问题,我们都可以简单的写出O(n)的从头到尾为的扫描算法,这里就不在累赘,这里我们讨论的是基于二分查找的算法,使其时间在渐进意义上达到O(logn). 对于有序的数组,很"容易"写出基于二分的函数. 那么问题2,对于无序数组,怎么查找呢?这里我们用到了快速排序的划分原则.算法

对无序数组的并发搜索的java实现

对无序数组的并发搜索的实现可以充分的用到多cpu的优势 一种简单的策略是将原始数组按照期望的线程数进行分割,如果我们计划使用两个线程进行搜索,就可以把一个数组分成两个,每个线程各自独立的搜索,当其中有一个线程找到数据后,立即返回结果的index即可. 首先index需要采用atomicinteger来进行修饰,默认初始化的值为-1,意义为当前未找到,由于内部采用CAS机制,线程在遍历比较是否相等之前,会通过atomicinteger中的get方法拿到当前的值,如果大于等于0,那么说明别的线程已经

Java数据结构与算法(第二章数组)

数组是应用最广泛的数据存储结构.它被植入到大部分编程语言中. Java中数组的基础知识     创建数组 在Java中把它们当作对象来对待,因此在创建数组是必须使用new操作符:     int[] intArray;            //defines a reference to an array     ingArray = new int[100];    //creates the array, and                                  //set

Java数据结构和算法(二)——数组

上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖——数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要的数据结构,当然每种语言对数组的实现和处理也不相同,但是本质是都是用来存放数据的的结构,这里我们以Java语言为例,来详细介绍Java语言中数组的用法. 1.Java数组介绍 在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型. ①.数组的声明 第一种方式: 数据类型 []

无序数组a,求a[i]-a[j]的最大值,且i&lt;j

一道面试题:对于无序数组a,求a[i]-a[j]的最大值,其中i<j 1 package test; 2 3 import java.util.Arrays; 4 5 public class FindMax { 6 public static void main(String[] args) { 7 int[] a = new int[] { 9, 20, 3, 16, 6, 5, 7, 1 }; 8 System.out.println("a[" + a.length + &

有1,2,3一直到n的无序数组,排序

题目:有1,2,3,..n 的无序整数数组,求排序算法.要求时间复杂度 O(n), 空间复杂度O(1). 分析:对于一般数组的排序显然 O(n) 是无法完成的. 既然题目这样要求,肯定原先的数组有一定的规律,让人们去寻找一种机会. 例如:原始数组: a = [ 10, 6,9, 5,2, 8,4,7,1,3 ] ,如果把它们从小到大排序且应该是 b = [1,2,3,4,5,6,7,8,9,10 ],也就是说: 如果我们观察 a --> b 的对映关系是: a[i] 在 b 中的位置是 a[i]