二.查找算法:
1.顺序查找
2.二分查找
需要数组/链表有序,永远折半,直到找到目标。
int BinarySearch(int a[], int value, int low, int high)
{
int mid = low+(high-low)/2;
if(a[mid]==value)
return mid;
if(a[mid]>value)
return BinarySearch(a, value, low, mid-1);
if(a[mid]<value)
return BinarySearch(a, value, mid+1, high);
}
3.插值查找:
把二分查找中的 mid=low+1/2(high-low) ,改为 mid=low+(key-a[low])/(a[high]-a[low])(high-low)一.排序算法:
| 排序名称 | 时间复杂度 | 是否稳定 | 额外空间开销 |
|---|---|---|---|
| 插入排序 | O(n^2) | 稳定 | O(1) |
| 冒泡排序 | O(n^2) | 稳定 | O(1) |
| 选择排序 | O(n^2) | 不稳定 | O(1) |
| 希尔排序 | O(n^2) | 不稳定 | O(1) |
| 归并排序 | O(nlogn) | 稳定 | O(n) |
| 快速排序 | O(nlogn) | 不稳定 | O(1) |
插入排序:双循环,外部指针不断右移,内部指针在外部指针已经移动过的部分中从右向左插入它的排序位置。
public static int[] sort(int[] ins){for(int i=1; i<ins.length; i++){int temp = ins[i];int j;for(j=i; j>0&&ins[j-1]>temp; j--){ins[j] = ins[j-1];}ins[j] = temp;}return ins;}


冒泡排序:双循环,外部指针不断右移,内部指针通过遍历外部指针未移动部分找到极值放入外部指针所在位置。找极值方法为相邻比较,如需要则交换。
public static void BubbleSort(int[] arr) {int temp;for(int i=0;i<arr.length-1;i++){for(int j=0;j<arr.length-i-1;j++){if(arr[j+1]<arr[j]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}


选择排序:双循环,外部指针不断右移,内部指针通过遍历外部指针未移动部分找到极值放入外部指针所在位置。找极值方法为记录当前极值,直到完成一轮遍历。
public static void selectSort(int[] arr){for(int i = 0; i < arr.length-1; i++){int min = i;for(int j = i+1; j <arr.length ;j++){if(arr[j]<arr[min]){min = j;}}int temp = arr[a];arr[a] = arr[b];arr[b] = temp;}}


希尔排序:三重循环。最外层控制步长,内部两个循环是对步长间隔的元素做插入排序。
public static void shellSort(int[] arr) {for (int step = arr.length / 2; step > 0; step /= 2) {for (int i = step; i < arr.length; i++) {int value = arr[i];int j;for (j = i - step; j >= 0 && arr[j] > value; j -= step) {arr[j + step] = arr[j];}arr[j + step] = value;}}}
归并排序:分治思想,先分成多块排好序的,再合并成一块排好序的,只要定义好单块合并的规则就可以,出口就是已经分成仅一个对象的块。
public void merge(int []a,int left,int mid,int right){int []tmp=new int[a.length];int p1=left,p2=mid+1,k=left;while(p1<=mid && p2<=right){if(a[p1]<=a[p2])tmp[k++]=a[p1++];、elsetmp[k++]=a[p2++];}while(p1<=mid) tmp[k++]=a[p1++];while(p2<=right) tmp[k++]=a[p2++];for (int i = left; i <=right; i++)a[i]=tmp[i];}public void mergeSort(int [] a,int start,int end){if(start<end){int mid=(start+end)/2;mergeSort(a, start, mid);mergeSort(a, mid+1, end);merge(a, start, mid, end);}}
快速排序:选一个需要被排序的数作为基数,大于这个基数的放到右边,小于这个基数的放到左边,一趟结束后,将基数放到中间分隔的位置。第二趟将数组从基数的位置分成两半,分割后的两个的数组继续重复以上步骤,直到数组不能再分为止,排序结束。
public static void sort(int[] arr,int start,int end){//直到start>=end时结束递归if(start<end){int left = start;int right = end;int temp = arr[start];while(left<right){//右面的数字大于标准数时,右边的数的位置不变,指针向左移一个位置while(left<right && arr[right]>temp){right--;}//右边的数字及下标小于或等于基本数,将右边的数放到左边if(left<right) {arr[left] = arr[right];left++;}//左边的数字小于或等于标准数时,左边的数的位置不变,指针向右移一个位置while(left<right && arr[left]<=temp){left++;}//左边的数字大于基本数,将左边的数放到右边arr[right] = arr[left];}//一趟循环结束,此时left=right,将基数放到这个重合的位置,arr[left] = temp;//将数组从left位置分为两半,继续递归下去进行排序sort(arr,start,left);sort(arr,left+1,end);}}

二.查找算法:
1.顺序查找
2.二分查找
需要数组/链表有序,永远折半,直到找到目标。
int BinarySearch(int a[], int value, int low, int high){int mid = low+(high-low)/2;if(a[mid]==value)return mid;if(a[mid]>value)return BinarySearch(a, value, low, mid-1);if(a[mid]<value)return BinarySearch(a, value, mid+1, high);}
3.插值查找:
把二分查找中的 mid=low+1/2(high-low) ,改为 mid=low+(key-a[low])/(a[high]-a[low])(high-low)
