问题描述
设顺序表A中的数据元素递增有序,试写一程序,将x插入到顺序表的适当位置上,使该表仍然有序
输入
顺序表元素的个数,顺序表中递增有序的多个数,要插入的数
输出
原顺序表的数据,插入一个数后顺序表的数据
存储结构
采用顺序表存储
算法的基本思想
自定义一个类,包含两个属性,一个为数组用来记录数据,一个为int型数据用来记录数组的容量。顺序表的初始化:设置默认值即使用无参构造时会实例化一个默认值大小的数组,数组容量也为默认值,若使用有参构造进行初始化,由使用者决定数组的容量。数组扩容:通过一个新的数组实现,新的数组容量为旧数组长度加设置的增量。插入一个数仍保持有序:定义一个索引指向最后一个元素,依次向前与插入数据进行比较,直到找到第一个比插入数据小的数据,此时将这个数据之后的数据都后移一位,将要插入的数据赋值给索引加一处的位置。
源代码
import java.util.Scanner;
public class SqList {
private final int DEFAULT_SIZE = 20;//初始数组分配容量
private final int CREATE_SIZE = 1; //每次扩容的增量
private int[] list;
private int size; //数组容量
public SqList() {
this.list = new int[DEFAULT_SIZE];
this.size = DEFAULT_SIZE;
}
public SqList(int[] head, int size) {
this.list = head;
this.size = size;
}
public void setSize(int size) {
this.size = size;
}
public void setList(int[] list) {
this.list = list;
}
public int[] getList() {
return list;
}
public int getSize() {
return size;
}
boolean insert(int e){
capacityExpansion(); //看看是否需要扩容
int count = 0; //要后移的元素的个数
int index = list.length-1-CREATE_SIZE;
while (index >= 0 && e < this.list[index]){
count++;
index--;
}
if (this.list.length - (index + 1) >= 0){
System.arraycopy(this.getList(),index+1,this.getList(),index+2,count);
}
this.list[index+1] = e;
return true;
}
void capacityExpansion(){
if (this.size <= this.list.length){ //没有空间了,必须扩容
int[] newInt = new int[this.size + CREATE_SIZE];
if (this.size >= 0) System.arraycopy(this.list, 0, newInt, 0, this.size);
this.list = newInt;
this.setSize(this.size + CREATE_SIZE);
}
}
}
class Test{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("输入顺序表的元素个数\t");
int len = sc.nextInt();
int[] list = new int[len];
System.out.println("输入"+len+"个递增有序的数字");
for (int i = 0;i < len;i++){
list[i] = sc.nextInt();
}
SqList sqList = new SqList(list,len);
System.out.println("原始顺序表元素");
for (int e : sqList.getList()){
System.out.print(e + "\t");
}
System.out.print("\n输入要插入的数据\t");
int e = sc.nextInt();
boolean judge = sqList.insert(e);
if (judge){
System.out.println("插入成功");
}
System.out.println("插入数据后的顺序表为");
for (int x : sqList.getList()){
System.out.print(x + "\t");
}
}
}