一些常用的算法记录

来源:互联网 发布:空之境界 知乎 编辑:程序博客网 时间:2024/06/09 15:42

1:插入算法

public static void main(String[] args) {int[] arr = new int [100000];for(int i=0;i<arr.length;i++){arr[i]=(int)(1+Math.random()*(100000-1+1));}Date time1=new Date();Long a1=time1.getTime();//for(int i=0;i<1000000;i++){sort(arr,arr.length);//}Date time2=new Date();Long a2=time2.getTime();Long time=a2-a1;System.out.println(Arrays.toString(arr));System.out.println("所需的时间为:"+time);}private static void sort(int[] arr, int x) {int j=0;int i;int temp;for(i=1;i<x;i++ ){temp=arr[i];j=i-1;while(j>=0&&arr[j]>=temp){arr[j+1]=arr[j];j--;}arr[j+1]=temp;}}

2:归并排序

public static void main(String[] args) {int[] arr = new int [100000];for(int i=0;i<arr.length;i++){arr[i]=(int)(1+Math.random()*(100000-1+1));}Date time1=new Date();Long a1=time1.getTime();//for(int i=0;i<1000000;i++){sort(arr,0,arr.length-1);//}Date time2=new Date();Long a2=time2.getTime();Long time=a2-a1;System.out.println(Arrays.toString(arr));System.out.println("所需的时间为:"+time);}private static void sort(int[] arr, int low, int high) {int mid=(low+high)/2;if(low<high){sort(arr,low,mid);sort(arr,mid+1,high);merge(arr, low, mid, high);}}private static void merge(int[] arr, int low,int mid, int high){int i=low;int j=mid+1;int k=0;int [] temp=new int [high-low+1];while(i<=mid&&j<=high){if(arr[i]<arr[j]){temp[k++]=arr[i++];}else{temp[k++]=arr[j++];}}while(i<=mid){temp[k++]=arr[i++];}while(j<=high){temp[k++]=arr[j++];}for(int x=0;x<temp.length;x++){arr[x+low]=temp[x];}}
3:快速排序

public static void main(String[] args) {int[] arr = new int [100000];for(int i=0;i<arr.length;i++){arr[i]=(int)(1+Math.random()*(100000-1+1));}Date time1=new Date();Long a1=time1.getTime();//for(int i=0;i<1000000;i++){sort(arr,0,arr.length-1);//}Date time2=new Date();Long a2=time2.getTime();Long time=a2-a1;System.out.println(Arrays.toString(arr));System.out.println("所需的时间为:"+time);}private static void sort(int [] arr,int low,int high) {int bridge;int j=low-1;for(int i=low;i<high;i++){if(arr[i]<arr[high]){bridge = arr[++j];arr[j]=arr[i];arr[i]=bridge;}}bridge=arr[j+1];arr[j+1]=arr[high];arr[high]=bridge;//递归必须要有终止条件if(low<j){sort(arr,low,j);}if(j+2<high){sort(arr,j+2,high);}}

4:希尔排序

public static void main(String[] args) {int[] arr = new int[100000];for (int i = 0; i < arr.length; i++) {arr[i] = (int) (1 + Math.random() * (100000 - 1 + 1));}Date time1 = new Date();Long a1 = time1.getTime();// for(int i=0;i<1000000;i++){sort(arr, arr.length);// }Date time2 = new Date();Long a2 = time2.getTime();Long time = a2 - a1;System.out.println(Arrays.toString(arr));System.out.println("所需的时间为:" + time);}private static void sort(int[] arr, int length) {int n = length / 2;while (n > 0) {int i = n, j;int temp;for (; i < length; i += n) {temp = arr[i];j = i - n;while (j >= 0 && arr[j] >= temp) {arr[j + n] = arr[j];j -= n;}arr[j + n] = temp;}n = n / 2;}}

5:BFPRT第n大

public static void bubble(int[] a, int first, int end) {// 冒泡排序for (int flag = first; flag < end; flag++) {for (int i = end; i > flag; i--) {if (a[i] < a[i - 1]) {int t = a[i];a[i] = a[i - 1];a[i - 1] = t;}}}}// 求取最小的k个数// 数组a中从a[p]到a[r]的元素按照x划分,大于或者等于x的在右边,小于x的在左边public static int  partitionModify(int[] a, int p, int r, int x) {int i, j;for (i = p, j = r; i < j; i++) {if (a[i] >= x) {while (i < j && a[j] >= x) {j--;}if (i != j) {int t = a[i];a[i] = a[j];a[j] = t;j--;} else {break;}}}/* * 上面的循环结束分为几种情况 1 i > j 此时必定有 a[i] >= x,否则 a[j+1] = a[i] < x 与 a[j+1] * >= x 矛盾 ,如果不是边界,进入if语句 2 i = j 此时如果 a[i] < x 则a[i+1] = a[j+1] >x 返回 i * 3 当i==p,此时直接返回边界元素下标 4 当i == r,此时为右边界,此时a[i]肯定为x,返回i - 1,也即r - 1 */if (a[i] >= x && i > p) {return i - 1;}return i;}public static int selectModify(int [] a,int p, int r, int k) {//寻找中位数int i;if (r - p + 1 <= 5) {bubble(a, p, r);return a[p + k - 1];}// 将r-p+1个数据按五个元素分为一组,可以分为(r - p + 1) / 5组// 分别找出各组的中位数,再将各组的中位数与数组开头的数据按组的顺序依次交换for (i = 0; i < (r - p + 1) / 5; i++) {int s = p + 5 * i, t = s + 4;bubble(a, s, t);int temp = a[p + i];a[p + i] = a[s + 2];a[s + 2] = temp;}// 对这些各组的中位数// 按同样的方法继续求出中位数,最后得出的整个数组的中位数 xint x = selectModify(a, p, p + (r - p + 1) / 5 - 1, (r - p + 6) / 10);i = partitionModify(a, p, r, x);int j = i - p + 1;if (k <= j) {return selectModify(a, p, i, k);} else {return selectModify(a, i + 1, r, k - j);}}public static void main(String[] args) {int [] a={2,3,1,4,2,2,2,4,5,7,9,45,980,12};System.out.println(Arrays.toString(a));bubble(a, 0, a.length-1);System.out.println(Arrays.toString(a));System.out.println(selectModify(a, 0, a.length-1, 11));}


0 0