查找
线性查找法
线性查找法警要查找的关键字key与数组中的元素逐个进行比较,匹配成功,返回关键字在数组中的下标,否则返回-1
/*线性查找*/
public class LinearSearch(){
public static int linearSearch(int[] list,int key){
for (int i = 0; i < list.length; i++) {
if (list[i] == key) {
return i;
}
}
return -1;
}
}
二分查找法
二分查找的前提是数组中的元素必须已经排好序。
查找时的三种情况:
- 如果关键字小于中间元素,只需要在数组的前一半中继续查找关键字;
- 如果关键字等于中间元素,匹配成功,查找结束;
- 如果关键字大于中间元素,只需要在数组的后一半中继续查找关键字。
public static int binarySearch(int[] array, int key){
int low = 0;
int high = array.length - 1;
while(high >= low){
int mid = (low + high)/2;
if (key < array[mid])
high = mid - 1;
else if(key == array[mid])
return mid;
else {
low = mid -1;
}
}
return -low-1;//没有找到时,返回-(low+1),其中low+1为应该将该值插入的地方
}
排序
- 选择排序
按升序(降序)排列一个数列,选择排序法先找到数列中的最小数(最大数),然后将它放在数列最前面。接下来,在剩下的数中找到最小数(最大数),将它放在第一个数的后面,依次类推,直到数列中仅剩一个数为止。
public static void main(String[] args) {
int[] array = new int[]{5,1,3,43,64,36,73,45};
selectionSort(array);
System.out.println(Arrays.toString(array));
}
/*
* 升序排列的选择排序
* */
public static void selectionSort(int[] array) {
int tmp;
//记录排序的趟数
for (int i = 0; i < array.length; i++) {
int minIdx = i;
//找到每一趟排序的最小值索引
for (int j = i+1; j < array.length; j++) {
if (array[j] < array[minIdx]) {
minIdx = j;
}
}
//第i躺排序,交换最小值到array[i]
if (minIdx != i) {
tmp = array[i];
array[i] = array[minIdx];
array[minIdx] = tmp;
}
}
System.out.println(Arrays.toString(array));
}
- 插入排序
插入排序法的算法是在已排好序的子数列中反复插入一个新元素来对数列值进行排序,直到整个数列全部排好序。
- 不用新建数组:
public static void insertSort(int[] array) { int tmp; for (int i = 1; i < array.length; i++) { tmp = array[i]; for (int j = i-1; j >= 0; j--) { if (tmp < array[j]) { array[j+1] = array[j]; } else { array[j+1] = tmp; break; } if (j-1 == -1) { array[0] = tmp; } } } System.out.println(Arrays.toString(array)); }
- 通过新建一个长度相等的数组来完成,空间开销大
public static void main(String[] args) {
int[] array = new int[]{5,1,3,100,43,64,36,73,45};
System.out.println(Arrays.toString(array));
selectionSort(array);
insertSort(array);
}
/*
* 升序排列的插入排序,空间复杂度为O(n)
* */
public static void insertSort(int[] array) {
int[] newArray = new int[array.length];
int lastPos = 0;
newArray[0] = array[0];
for (int i = 1; i < newArray.length; i++) {
for (int j = lastPos; j >= 0; j--) {
//比array[i]大的数往后移动一位
if ( newArray[j] > array[i]) {
newArray[j+1] =newArray[j];
}
//找到要插入的位置,执行插入操作
else {
newArray[j+1] = array[i];
break;
}
}
lastPos++;
}
System.out.println(Arrays.toString(newArray));
}