一些常用的算法记录

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;
		}

		// 对这些各组的中位数
		// 按同样的方法继续求出中位数,最后得出的整个数组的中位数 x
		int 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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值