- 今天整理了一些常用的数组操作,如最大值,查找,排序等等
数组最大值
值判断
1 | public int maxValue(int[] a){ |
下标判断
1 | public int maxIndex(int[] a){ |
数组操作辅助方法
交换值
1 | public void swap(int[] arr,int a,int b){ |
输出链表
1 | public void printList(int[] arr){ |
数组选择排序
1 | public void chooseSort(int[] arr){ //选择排序 |
选择排序改进版
- 改进版的选择排序,设置了角标值和数组值
1
2
3
4
5
6
7
8
9
10
11
12
13
14public void chooseSort2(int[] arr){
for(int i=0;i<arr.length-1;i++) {
int number = arr[i];
int index = i;
for (int j = i + 1; j < arr.length; j++) {
if (number > arr[j]) {
number = arr[j];
index = j;
}
}
if (index!=i)
swap(arr,i,index);
}
}
数组冒泡排序
- 冒泡排序,五个数为例,共进行4+3+2+1 10次比较
1
2
3
4
5
6
7
8
9
10
11
12public void ppSort(int[] arr){ //便于理解
int temp = 0;
for(int i = 0;i<arr.length-1;i++)
for (int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
//swap(arr,j,j+1);
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] =temp;
}
}
}
冒泡排序改进版
1 | public void ppsort2(int[] arr){ //改进版冒泡 |
查找
通过值查找
1 | public int findByValue(int[] arr,int key){ //通过值查找 |
二分查找
1 | public int findHalf(int[] arr,int key){ //二分查找 |
练习题
给定一个有序的数组,如果往该数组中存储一个元素,并保证这个数组还是有序的,那么这个元素的存储的角标该如何获取?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public int getJiaoBiao(int[] arr,int key){ /
list list = new list();
list.chooseSort2(arr);
int min =0;
int max =arr.length-1;
int mid;
while(min<=max){
mid = (min+max)>>1;
if(key>arr[mid])
min = mid + 1;
else if (key<arr[mid])
max = mid - 1;
else
return mid;
}
return min;
}在系统自带的Arrays类中,有这个方法,不过和我这个写的不一样,比我的更好一些,我把源码粘贴上来
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}不同的是返回值 比如我的答案如果是6,那么他的答案就会是-7,为什么那?
- 因为要插入的这个数是不存在于数组中的,所以给他一个负数的位置,那么-7怎么来的?-6-1,因为还有1个值,就是用我的方法得到0的那个值,取了负数还是0,不好分辨,所以就整体取负后再减一
- 总结说:存在,返回具体的角标位置,不存在的话 返回 -插入点-1