2019独角兽企业重金招聘Python工程师标准>>>

有序数组:数组存储有序的元素

不足:暂不考虑重复数组元素的问题

思路:通过代理模式,代理Java已实现的数组对象,实现有序数组的功能

有序数组结构主体


package com.zhiwei.array;public class OrderArray {private int[] orderArray;private int nElems;  //非空元素个数private int initSize; //数组最大容纳元素个数public OrderArray(int initSize){this.orderArray = new int[initSize];this.nElems = 0;this.initSize = initSize;}
}

添加新元素:addElem(int value)


①:数组已经初始化其内存空间是不能发生改变的,因此数组添加新元素的时候需要考虑数组的存储空间是否有限的问题 ②:新元素有序插入:确定新元素位置--> 原数组受影响元素向后移动1位--> 存放新元素 ③:更新数组的属性信息:非空元素个数等

public boolean addElem(int value){if(nElems>=initSize){ return false;}int index = 0; for(int i=0;i<nElems;i++){if (value < orderArray[i]){index = i;  break;}}//最后一个非空元素开始后移1位for(int j=nElems-1;j>=index;j--){orderArray[j+1] = orderArray[j];}orderArray[index] = value;nElems++;return true;}

删除元素:delElem(int value)


  1. 检查原数组是否包含指定值的元素,如果不存在则不处理
  2. 有序数组删除元素:确定目标元素位置--> 受影响元素前移动1位--》重置原数组最后一个元素值
  3. 更新有序数组属性:非空元素个数等 注意:元素添加的时候已经保证元素的顺序,删除不影响原有的排列顺序
public  boolean delElem(int value){boolean flag = false;int index = 0;for(int i=0;i<nElems;i++){ if(value == orderArray[i]){index = i;flag = true;break;}}if(!flag)  return false;for(int i=index;i<nElems-1;i++){  orderArray[i] = orderArray[i+1];}orderArray[nElems-1] = 0;  nElems--;return true;}

更新元素:updateElem(int index,int value)


  1. 检查设置的元素下表是否越界
  2. 保证更新后的数组的有序:更新指定的元素->排序
public boolean updateElem(int index,int value){if(index>=nElems) return false;orderArray[index] = value;sortArray(); //重新排序:这里采用冒泡法return true;}

冒泡排序法


思想:每次排序都将最大或者最小的元素筛选出来放在最后,然后一次对剩下的元素进行最值筛选,最后形成有序的序列 sortArray()方法:

public void sortArray(){for(int i=0;i<nElems;i++){for(int j=0;j<nElems-i-1;j++){if(orderArray[j]>orderArray[j+1]){int temp = orderArray[j];orderArray[j] = orderArray[j+1];orderArray[j+1] = temp;}}}}

数组遍历展示:show()

public void show(){StringBuffer sb = new StringBuffer();sb.append("数组元素:[");for(int i=0;i<nElems;i++){sb.append(orderArray[i]+",");}sb.deleteCharAt(sb.length()-1).append("]");System.out.println(sb);}

返回数组长度:length()


public int length(){return nElems;}

测试代码


OrderArray orderArray = new OrderArray(10);       orderArray.addElem(10);orderArray.addElem(8);orderArray.addElem(9);orderArray.addElem(5);orderArray.addElem(8);orderArray.addElem(7);orderArray.show();orderArray.delElem(11);orderArray.show();orderArray.delElem(8);orderArray.delElem(9);orderArray.show();orderArray.updateElem(3,6);orderArray.show();System.out.println(orderArray.length());

结果:

补充说明:

因为是有序数组,通过addElem()方法添加新元素时,元素自动排序插入,因此插入元素顺序和数组存储的元素下标顺序并没有绝对的对应的关系,因此未提供正对索引的赋值或取值的操作方法

转载于:https://my.oschina.net/yangzhiwei256/blog/3008636

【数组】 - 有序数组设计相关推荐

  1. LeetCode实战:合并两个有序数组

    题目英文 Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. No ...

  2. LeetCode实战:寻找两个有序数组的中位数

    题目英文 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th ...

  3. 算法-----有序数组的平方

    题目 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: 输入:nums = [-4,-1,0,3,10] ...

  4. 「 每日一练,快乐水题 」540. 有序数组中的单一元素

    ✅力扣原题: 力扣链接:540. 有序数组中的单一元素 ✅题目简述: 给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次. 请你找出并返回只出现一次的那个数. 你设计的解 ...

  5. 540.有序数组中的单一元素

    难度:中等 目录 一.问题描述 二.思路 1.解题思路 1.思路一 2.思路二 2.极端情况判断 3.极端情况解决 三.解题 1.代码实现 1.方法一 2.方法二 2.时间复杂度 and 空间复杂度 ...

  6. LeetCode4寻找两个有序数组的中位数(二分查找+分治)

    目录 1.题目 2.分析 3.代码 二分查找:绝大多数二分查找问题利用的是单调性,也有一些例外)或者题目本身蕴含的可以逐渐缩小问题规模的特性解决问题.时间复杂度log级. 分治法的设计思想是:将一个难 ...

  7. LeetCode4.python实现:寻找两个有序数组中的中位数问题☆☆☆

    目录 问题 解题思路 python具体实现 题外话 问题 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log( ...

  8. 力扣题:977. 有序数组的平方

    题目链接:977. 有序数组的平方 题目: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: 输入:nums = [-4, ...

  9. leecode:977. 有序数组的平方

    leecode::977. 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 请你设计时间复杂度为 O(n) 的算法解 ...

最新文章

  1. 176页报告辟谣自动化时代的就业危机(附下载)
  2. 斯坦福大学「黑盒学习」研究:使用神经变分推理的无向图模型,可替代「采样」 | 附NIPS 2017论文
  3. 双网口相机用序列号打开
  4. 编码最佳实践——Liskov替换原则
  5. Py之Data Base:Python和数据库的那些嘻嘻哈哈事详细攻略
  6. Nginx七层负载均衡配置
  7. [转]c#调用API截图
  8. javascript原型_JavaScript原型初学者指南
  9. Linux 系统应用编程——网络编程(常用命令解析)
  10. 记一次项目代码重构:使用Spring容器干掉条件判断
  11. Python画图(直方图、多张子图、二维图形、三维图形以及图中图)
  12. Bailian2721 忽略大小写比较字符串大小(POJ NOI0107-16)【字符串】
  13. ajax方法参数详解
  14. 踩坑记录——ProxyServer删除问题经验分享
  15. css 样式面板,CSS样式面板.ppt
  16. 简易网页音乐播放器制作
  17. Python爬取QQ音乐评论数据
  18. 搞笑的chitgpt
  19. lstrcpyn和strncpy
  20. Tracert命令 路由跟踪数据包解析

热门文章

  1. python多线程并行编程,Python并行编程(二):基于线程的并行
  2. mybatis 原理_Mybatis工作流程及其原理与解析
  3. js兼容安卓与ios的复制到粘贴板功能
  4. 分享几个vscode的插件
  5. java面试的题积累【持续更新中......】
  6. springboot配置https访问
  7. 原生javascript实现完整的轮播图
  8. Python: Console框消失
  9. Boost-QT兼容问题:#define FUSION_HASH #
  10. 使用QT的一些小Tipster