数组_有序数组

public class OrdArray {
    private long[] a;
    private int nElems;
    public OrdArray(int maxSize) {
        a=new long[maxSize];
        nElems=0;
    }
    public int size() {
        return nElems;
    }
    //有序数组的插入(需要找到位置)
    public void insert(long value) {
        int j;
        for(j=0;j<nElems;j++)
            if(a[j]>value)
                break;
        //挪出位置
        for(int k=nElems;k>j;k--)
            a[k]=a[k-1];
        a[j]=value;
        nElems++;

    }

    public boolean delete(long value) {
        int j;
        for(j=0;j<nElems;j++)
            if(a[j]==value)
                break;
        if(j==nElems)
            return false;
        else
            for(int k=j;k<nElems;k++)
                a[k]=a[k+1];
        nElems--;
        return true;
    }
    //用二分查找方式找到位置,删除数据
    public boolean findDelete(long value) {
        int j=find(value);
        if(j==nElems)
            return false;
        else
            for(int k=j;k<nElems;k++)
                a[k]=a[k+1];
        nElems--;
        return true;
    }
    //二分查找
    public int find(long searchKey) {
        int lowerBound=0;
        int upperBound=nElems-1;
        int curIn;
        while(true) {
            curIn=(lowerBound+upperBound)/2;
            if(a[curIn]==searchKey)
                return curIn;
            else if(lowerBound>upperBound)
                return nElems;//没有找到,返回数据总量
            else
            {
                if(a[curIn]<searchKey)
                    lowerBound=curIn+1;
                else
                    upperBound=curIn-1;

            }

        }
    }
    public void display() {
        for(int j=0;j<nElems;j++)
            System.out.print(a[j]+" ");
        System.out.println();
    }

}
public class Test {

    public static void main(String[] args) {
        int maxSize=100;
        OrdArray array;
        array=new OrdArray(maxSize);
        array.insert(77);
        array.insert(99);
        array.insert(44);
        array.insert(55);
        array.insert(22);
        array.insert(88);
        array.insert(11);
        array.insert(00);
        array.insert(66);
        array.insert(33);
        if(array.find(55)!=array.size())
            System.out.println("found");
        else
            System.out.println("no found");
        array.display();
        array.findDelete(00);
        array.findDelete(55);
        array.findDelete(99);
        array.display();

    }

}
时间: 2024-10-30 00:07:07

数组_有序数组的相关文章

【Leetcode 数组】 有序数组中出现次数超过25%的元素(1287)

题目 给你一个非递减的?有序?整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%. 请你找到并返回这个整数 示例: 输入:arr = [1,2,2,6,6,6,6,7,10] 输出:6 提示: 1 <= arr.length <= 10^4 0 <= arr[i] <= 10^5 解答 # class Solution: # def findSpecialInteger(self, arr): # d = {} # length = len(arr) #

二维数组_一维数组

二维数组在内存中占据连续的空间.在内存中从上到下存储各行元素,在同一行中按照从左到右的顺序存储. 因此可以根据行号和列号计算出相对于数组首地址的偏移量,从而找到对应元素. eg.      int *matrix    rows行columns列   matrix[ row * columns + column] 二维数组转化为一位数组: #include <iostream> using namespace std; void display(int* matrix) { cout <

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的

/* 第七章函数的基本知识 */ /*01)c++对于返回值有一定的限制:可以是常量.变量.指针.结构对象或表达式,但不可以是数组02)c++返回数组的方法:将数组作为结构会对象组成部分来返回03)函数遇到return则结束该函数04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起05)*/ //本代码注意double类型的写法以及double和int类型数据的转换 1 #include <iostream> 2 3 void che

KT学算法(二)——循环有序数组查找指定元素

问题描述 一个循环有序的数组是形如:"12,16,18,20,41,100,1,4,6,9" 这样的数组. 问题分析 对于循环有序数组,一种简单的定义是: 循环有序数组是将一个有序数组切成两段,并交换位置得到引用块内容 比如现将1,4,6,9,12,16,18,20,41,100在9和12处切分,得到两段:1,4,6,9和12,16,18,20,41,100,再交换这两段的位置就得到了一开始的循环有序数组. 另一种比较严格的定义是: 对于一个循环有序数组{A1,A2,--An},存在一

LeetCode--108--将有序数组转化为二叉搜索树

问题描述: 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 思路:由于数组是有序数组,所以只需用二分法构造即可,mid即为根节点,0:mid 的中间点为左子树的根节点,mid+1:末尾的中间点为右子树

LeetCode-108. 将有序数组转换为二叉搜索树

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 注:输入数组是有序数组,直接递归,但我没想出来,参考了别人的代码: 1 /** 2 * Definition for a binary tree nod

数组--将两个有序数组a,b合并成新的有序数组c

有两个有序的数组a,b;长度分别是m,n;请使用时间复杂度为m+n的算法,将此两个数组重新合并构成一个有序数组c. 1 static void Main(string[] args) 2 { 3 int[] a = { 1, 3, 5, 6, 6, 7, 14 }; 4 int[] b = { 2, 3, 4, 6, 7, 13, 18, 20 }; 5 6 var cLength = a.Length + b.Length; 7 int[] c = new int[cLength]; 8 in

167. 两数之和 II - 输入有序数组

Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 m

[Swift-2019力扣杯春季决赛]1. 有序数组中的缺失元素

给出一个有序数组 A,数组中的每个数字都是 独一无二的,找出从数组最左边开始的第 K 个缺失数字. 示例 1: 输入:A = [4,7,9,10], K = 1 输出:5 解释: 第一个缺失数字为 5 . 示例 2: 输入:A = [4,7,9,10], K = 3 输出:8 解释: 缺失数字有 [5,6,8,...],因此第三个缺失数字为 8 . 示例 3: 输入:A = [1,2,4], K = 3 输出:6 解释: 缺失数字有 [3,5,6,7,...],因此第三个缺失数字为 6 . 提示