1 package data.struct.algorithm;
2
3 import java.util.Arrays;
4
5 public class ArraysDemo {
6
7 // private static final int UNSORTARRAYSIZE = 10;
8
9 /**
10 * @param args
11 */
12 /*
13 * 数据结构之数组的运用,无非是增删查操作,就有序数组和无序数组进行这三种操作
14 */
15 public static void main(String[] args) {
16
17 // 无序数组,假定数组中元素互不相同
18 int arr[] = new int[] { 10, 5, 7, 9, 42, 35, 46, 74, 3, 52, 252 };
19 displayArr(arr);
20 // 有序数组,假定数组中元素互不相同
21 int arrSort[] = new int[] { 98, 65, 34, 25, 19, 16, 8, 4, 2, 1 };
22 displaySortArr(arrSort);
23 int key = 42;// 有序、无序数组查找是否存在42这个元素
24 unSortSearchKey(arr, key);// 无序查找
25 int position = sortSearchKey(arrSort, key);// 有序查找
26 System.out.println(key + "在有序数组中索引为" + position + "个位置");
27 //有序数组arrSort中插入一个指定大小的元素
28 int key_insert=56;
29
30 int arr_copySort[]=insertKey(arrSort,key_insert);//有序数组插入元素,用一个数组接收返回的数组
31 displaySortArr(arr_copySort);
32 insertKey_2(arr,key_insert);//无序数组插入元素
33 int delSortIndexKey=5;
34 int delUnSortIndexKey=4;
35 delete_1(arrSort,delSortIndexKey);
36 delete_2(arr,delUnSortIndexKey);
37
38 }
39 //无序数组删除元素
40 public static void delete_2(int[] arr, int delUnSortIndexKey) {
41
42 }
43 //有序数组删除元素
44 public static void delete_1(int arr[],int delSortIndexKey) {
45 if(delSortIndexKey>=arr.length){
46 return;
47 }
48 for(int i=delSortIndexKey;i<arr.length-1;i++){
49 arr[i]=arr[i+1];
50 }
51 arr[arr.length-1]=0;
52 displaySortArr(arr);
53 }
54 //无序数组中插入元素(数组扩容,插入到数组的最后即可)
55 public static void insertKey_2(int[] arr, int key_insert) {
56 Arrays.copyOf(arr, arr.length+1);
57 arr[arr.length-1]=key_insert;
58 displayArr(arr);
59 }
60
61 public static void displaySortArr(int[] arrSort) {
62 for(int x=0;x<arrSort.length;x++){
63 System.out.print(arrSort[x]+" ");
64 }
65 System.out.println();
66 }
67 //打印输出数组中的元素
68 public static void displayArr(int[] arr) {
69 for(int x=0;x<arr.length;x++){
70 System.out.print(arr[x]+" ");
71 }
72 System.out.println();
73 }
74 //向有序数组中插入元素,并返回插入元素后的数组
75 public static int[] insertKey(int[] arrSort, int key_insert) {
76 // int left=0;
77 // int right=arrSort.length-1;
78 // int half=(left+right)/2;
79 int position=sortSearchKey(arrSort, key_insert);
80 if(position>=0){
81 arrSort=Arrays.copyOf(arrSort, arrSort.length+1);
82 for(int x=arrSort.length-1;x>position;x--){
83 arrSort[x]=arrSort[x-1];
84 }
85 arrSort[position]=key_insert;
86 // displayArr(arrSort);
87 }
88 else{
89 arrSort=Arrays.copyOf(arrSort, arrSort.length+1);
90 for(int x=arrSort.length-1;x>=-(position+1);x--){
91 arrSort[x]=arrSort[x-1];
92 }
93 arrSort[-(position+1)]=key_insert;
94 // displaySortArr(arrSort);
95 }
96 return arrSort;
97 }
98
99 // 有序数组查找特定元素,可以采用线性查找或者是二分查找(BinarySearch),这里我们使用二分查找
100 //数组为升序排列或降序排列,使用二分查找代码代码有些不同,坑爹呀
101 public static int sortSearchKey(int[] arrSort, int key) {
102
103 int max,min,mid;
104 min = 0;
105 max = arrSort.length-1;
106 while(min<=max)
107 {
108 mid = (max+min)>>1;
109 if(key>arrSort[mid])
110 max = mid - 1;
111 else if(key<arrSort[mid])
112 min = mid + 1;
113 else
114 return mid;
115 }
116 return -min-1;
117 }
118
119 // 无序数组查找特定元素,线性查找
120 public static void unSortSearchKey(int arr[], int key) {
121 for (int i = 0; i < arr.length; i++) {
122 if(arr[i]==key){
123 System.out.println(key+"在无序数组中索引为的"+i+"个位置");
124 }
125 else {
126 continue;
127 }
128 if(i==arr.length){
129 System.out.println(key+"不存在与无序数组中");
130 }
131 }
132
133 }
134
135 }