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));
}
}