1.查找算法
基本查找
二分查找
- 设置left mid right三个变量
- 每查一次就可以减少一半区间长度
插值查找和斐波那契查找
- 本质上就是二分查找,只不过mid的计算方式被优化

分块查找
2.排序算法
冒泡排序
- 相邻数据两两比较,小的放前面,大的放后面。
- 第一轮循环结束后,最大值已经找到了,并且在数组的最右面。
public class maopao {
public static void main(String[] args) {
int[] arr = {2,4,5,3,1};
for(int i=1;i<arr.length;i++){
for(int j=0;j<arr.length-i;j++){
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
选择排序
- 从0索引开始,拿着每一个索引上的元素跟后面的元素依次比较,小的放前面,大的放后面。依次类推。
public class xuanze {
public static void main(String[] args) {
int[] arr = {1,5,3,2,4};
for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i] > arr[j]){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
插入排序
- 将0索引的元素到N索引的元素看作是有序的,其他的视为无序的,然后去遍历无序的数据,并把元素插入到前面有序数据中合适的位置,遇到相同元素,直接插在后面。
public class charu {
public static void main(String[] args) {
int[] arr = {3,44,38,5,47,15,36,16,27,2,46,5,34,56,34};
int startIndex = -1;
for(int i = 0; i < arr.length; i++){
if(arr[i]>arr[i+1]){
startIndex = i+1;
break;
}
}
for(int i = startIndex; i < arr.length; i++){
int k = i;
for(int j = k-1; j >= 0;j--){
if(arr[k]<arr[j]){
int temp = arr[j];
arr[j] = arr[k];
arr[k] = temp;
k--;
}
else if(arr[k]>=arr[j]){
break;
}
}
}
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i]+ " ");
}
}
}
快速排序
- 用到了递归算法:方法调用方法本身。递归一定要有出口,要不然会内存溢出。
- 第一轮把0索引作为基准数,确定基准数在数组中正确的位置。(基准数归位)
- 比基准数小的全部在左边,大的全部在右边。
- 如果基准数选最左边,先移动右指针
- 如果基准数选最右边,先移动左指针
- 如果基准数选中间,顺序无所谓
- 下面是一个很重要的防御保护思想,外层循环只是控制一个入口,内层最好单独去判断。
while(外层条件) {
while(外层条件 && 内层条件) {
}
if(外层条件 && 内层条件){
}
}
import java.util.Arrays;
public class quicksort {
public static void main(String[] args) {
int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 19, 8};
quickSort(arr, 0, arr.length - 1);
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
}
public static void quickSort(int[] arr, int left, int right){
if(left >= right){
return;
}
int start = left;
int end = right;
int baseNumber = arr[left];
while(start < end){
while(start < end && arr[end] >= baseNumber){
end--;
}
while(start < end && arr[start] <= baseNumber){
start++;
}
if(start < end){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
arr[left] = arr[start];
arr[start] = baseNumber;
quickSort(arr, left, start - 1);
quickSort(arr, start + 1, right);
}
}
3.Arrays的API
- 它是操作数组的工具类

import java.util.Arrays;
public class ArraysDemo {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9,10};
System.out.println("------------------------------toString----------------------");
System.out.println(Arrays.toString(arr));
System.out.println("-----------------------------binarySearch--------------------");
System.out.println(Arrays.binarySearch(arr,10));
System.out.println(Arrays.binarySearch(arr,2));
System.out.println(Arrays.binarySearch(arr,20));
System.out.println("-----------------------------copyOf--------------------");
int[] copy = Arrays.copyOf(arr,8);
int[] copy2 = Arrays.copyOf(arr,20);
System.out.println(Arrays.toString(copy));
System.out.println(Arrays.toString(copy2));
System.out.println("-----------------------------copyOfRange--------------------");
int[] copy3 = Arrays.copyOfRange(arr,0,8);
System.out.println(Arrays.toString(copy3));
System.out.println("-----------------------------fill--------------------");
Arrays.fill(arr,100);
System.out.println(Arrays.toString(arr));
System.out.println("-----------------------------sort--------------------");
int[] arr2 = {12,2,8,67,4,3,23,333,23,-90};
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
}
}
array的sort方法的排序规则
package com.cqupt;
import java.util.Arrays;
import java.util.Comparator;
public class ArrayDemo {
public static void main(String[] args) {
Integer[] arr = {2,3,1,5,6,7,8,4,9};
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(Arrays.toString(arr));
}
}