数据结构与算法--有序数组和二分法查找
2018-03-20 22:33
309 查看
package youxu;
/**
* 有序数组
*/
public class YouXu {
private long[] a;
private int size;
public YouXu(int size){
a = new long[size];
size = 0;
}
public int size(){
return size;
}
//生成有序数组 添加数据
public void insert(long value){
int j;
//判断数组a中比传入的值大的位置
for(j=0;j<size;j++){
if(a[j]>value)
break;
}
//移动后续的数组值
for(int k=size;k>j;k--){
//从数组索引的最后一个一个的查找到j的位置
a[k] = a[k-1];
}
a[j] = value; //设置当前数据
size++; //容量加1
}
//二分查找
public int find(int value){
int lowerIndex = 0; //记录最小索引
int maxIndex = size-1; //记录最大索引
int currentIndex; //记录当前索引
while(true){
currentIndex = (lowerIndex + maxIndex) / 2;
if(a[currentIndex]==value){ //正好在中间 直接返回
return currentIndex;
}else if(lowerIndex>maxIndex){ //最小索引大于最大索引 没有找到
return size; //返回最大容量
}else{
if(a[currentIndex]<value){ // 中间值小
lowerIndex = currentIndex+1; //将最小索引设置为中间索引+1
}else if(a[currentIndex]>value){ //中间值大
maxIndex = currentIndex-1; //将最大索引设置为中间索引-1
}
}
}
}
//删除数据项
public boolean delete(int value){
int j = find(value); //通过二分查找
if(j==size){ //没有找到
return false;
}else{
for(int i=j;i<size;i++){ // 找到了,将后一位索引上的数据向前移动一位
a[i] = a[i+1];
}
size--; //容量减1
return true;
}
}
//展示数组数据
public void show(){
for(int i=0;i<size;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
//初始化
YouXu xu = new YouXu(100);
System.out.println(xu.size());
xu.insert(12);
xu.insert(32);
xu.insert(1);
xu.insert(54);
xu.insert(66);
xu.insert(99);
xu.insert(54);
xu.insert(6);
xu.insert(109);
xu.insert(9);
System.out.println(xu.size());
//打印有序数组
xu.show();
//二分法查找
System.out.println("99的索引:"+xu.find(99));
System.out.println("100的索引:"+xu.find(100));
//删除
System.out.println(xu.delete(99));
System.out.println(xu.delete(100));
}
}
/**
* 有序数组
*/
public class YouXu {
private long[] a;
private int size;
public YouXu(int size){
a = new long[size];
size = 0;
}
public int size(){
return size;
}
//生成有序数组 添加数据
public void insert(long value){
int j;
//判断数组a中比传入的值大的位置
for(j=0;j<size;j++){
if(a[j]>value)
break;
}
//移动后续的数组值
for(int k=size;k>j;k--){
//从数组索引的最后一个一个的查找到j的位置
a[k] = a[k-1];
}
a[j] = value; //设置当前数据
size++; //容量加1
}
//二分查找
public int find(int value){
int lowerIndex = 0; //记录最小索引
int maxIndex = size-1; //记录最大索引
int currentIndex; //记录当前索引
while(true){
currentIndex = (lowerIndex + maxIndex) / 2;
if(a[currentIndex]==value){ //正好在中间 直接返回
return currentIndex;
}else if(lowerIndex>maxIndex){ //最小索引大于最大索引 没有找到
return size; //返回最大容量
}else{
if(a[currentIndex]<value){ // 中间值小
lowerIndex = currentIndex+1; //将最小索引设置为中间索引+1
}else if(a[currentIndex]>value){ //中间值大
maxIndex = currentIndex-1; //将最大索引设置为中间索引-1
}
}
}
}
//删除数据项
public boolean delete(int value){
int j = find(value); //通过二分查找
if(j==size){ //没有找到
return false;
}else{
for(int i=j;i<size;i++){ // 找到了,将后一位索引上的数据向前移动一位
a[i] = a[i+1];
}
size--; //容量减1
return true;
}
}
//展示数组数据
public void show(){
for(int i=0;i<size;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
//初始化
YouXu xu = new YouXu(100);
System.out.println(xu.size());
xu.insert(12);
xu.insert(32);
xu.insert(1);
xu.insert(54);
xu.insert(66);
xu.insert(99);
xu.insert(54);
xu.insert(6);
xu.insert(109);
xu.insert(9);
System.out.println(xu.size());
//打印有序数组
xu.show();
//二分法查找
System.out.println("99的索引:"+xu.find(99));
System.out.println("100的索引:"+xu.find(100));
//删除
System.out.println(xu.delete(99));
System.out.println(xu.delete(100));
}
}
相关文章推荐
- 设计一个模板类Sample,用于对一个有序数组采用二分法查找元素下标
- 利用二分法查找有序数组中某一元素
- 查找一个有序数组中的一个元素——二分法
- 有序数组和二分法查找
- 二分法实现一个整形有序数组的二分查找
- 二分法查找有序数组
- 二分法查找有序数组中某元素个数
- 二分法查找有序数组中的元素
- 个人练习数据结构之--------------关于线性数据的有序数组以及之上的二分法查找、不同排序方法的学习
- 二分法在有序数组中查找一个数
- 在一个有序数组中查找具体的某个数字——二分法——函数法
- 有序数组的二分法查找关键字
- (笔记)数组 插入式排序法 有序查找二分法
- 有序数组的二分法查找关键字
- 《数据结构与算法》学习笔记3 有序数组与二分查找
- 定义数组为有序数组模型,并利用二分法进行查找,删除特定值(缺点:只能删除一个值,若有相同的值,则删除第一个)
- 迭代用在有序数组二分法查找中,递归的二分法查找更简洁,但速度可能会慢一点
- 二分法查找有序数组
- 二分法在有序数组中进行查找
- java数据结构与算法-有序数组二分查找