数据结构-邓俊辉视频(java代码-排序算法 Chap1)

-Chapter1
1.1 Haistone

package Chap1;

import java.util.Scanner;

public class Hailstone {
	private static Scanner s;

	public static void main (String[] args) {
		int len = 1;
		System.out.println("Please input a int number:");
		s = new Scanner(System.in);
		int n = s.nextInt();
		
		while(n>1) {
			if(n%2==0)
				n = n/2;
			else
				n = 3*n+1;
			len++;
		}
		
		System.out.println(len);
	}
}

1.2 冒泡排序
使用sorted标记法,可以不需要运行n^2次,时间复杂度O(n2)。

package Chap1;

import java.util.Arrays;

public class OOOrder 
{
	public static void main(String[] args) 
	{
		int[] dt = new int[] {9,5,63,20,4,88,72};
		int[] b;
		b = OOOrder.data(dt);
		System.out.println("----"+Arrays.toString(b));
	}
	
	public static int[] data(int[] A) 
	{
		int cup1;
		int n = A.length;
		for(boolean sorted = false; sorted =!sorted; n--) 
		{
			System.out.println(n+":"+Arrays.toString(A));
			for (int i =1; i<n;i++) 
			{
				if(A[i-1]>A[i]) 
				{
					cup1 = A[i];
					A[i] = A[i-1];
					A[i-1] =cup1;
					sorted = false;
				}
			}		
		}		
		return A;
	}

}

1.3实现数组加和-递归法
使用断点调试,可以看清楚每一步发生了什么。逐步sum,之后再逐步返回,直到达到第一层的return。时间复杂度O(n)。

package Chap1;

//import java.util.Arrays;

public class Sumdataset {
	public static int sumint(int[] A,int n) {
		//System.out.println(Arrays.toString(A));
		return (n<1)? 0: (sumint(A,n-1)+A[n-1]);
		
	}
	
	public static void main(String[] args){
		int[] A = new int[] {21,1,3,6};
		int n = A.length;
		System.out.println(sumint(A,n));
	}
}

1.4 调换数组顺序-递归

package Chap1;

import java.util.Arrays;

public class Swampdt {
	public static void swampdt(int[] A,int lo,int hi) {
		if (lo<hi) {
			int c;
			c=A[hi];
			A[hi]=A[lo];
			A[lo]=c;
			swampdt(A,lo+1,hi-1);
			
		}
	}
	
	public static void main(String[] args) {
		int[] A = new int[] {12,2,4,3};
		System.out.println(Arrays.toString(A));
		
		int lo = 0;
		int hi = A.length-1;
		swampdt(A,lo,hi);
		System.out.println(Arrays.toString(A));
	}
}

1.5 数组加和-二分递归
时间复杂度O(n).

package Chap1;

public class binarysum {
	public static void main(String[] args) {
		
		int[] A = new int[]{1,4,6,23,11};
		int a = bsum(A,0,4);
		System.out.println(a);
		
	}
	
	public static int bsum(int[] A,int lo,int hi) {
		if(lo == hi)
			return A[lo];
		int mi = (lo+hi)>>1;
		return bsum(A,lo,mi)+bsum(A,mi+1,hi);
	}

}

1.6 找出数组中最大的两个元素-递归+分治法
由于Java没有指针,所以使用了对象引用的方法实现类似于指针的操作。

package Chap1;

import java.util.Arrays;

public class Max2 {
	public static void main(String[] args) {
		int[] A = new int[] {12,33,65,99,67,35,998,781,9980};
		int[] B = new int[2];
		max2(A,0,A.length,B);
		System.out.println(Arrays.toString(B));
	}
	
	public static void max2(int[] A ,int lo,int hi,int[] B) 
	{
		if(lo+2 ==hi) {
			if(A[lo]>A[lo+1]) {
				B[0] = lo;
				B[1] = lo+1;
				}else {
				B[0] = lo+1;
				B[1] = lo;
				}
			return;
		}
		
		if(lo+3 ==hi) {
			if(A[lo]>A[lo+1]) {
				if(A[lo]>A[lo+2]) {
					B[0] = lo;
					if(A[lo+1]>A[lo+2])
						B[1] = lo+1;
					else
						B[1] = lo+2;	
				}else {
					B[0] = lo+2;
					if(A[lo]>A[lo+1])
						B[1] = lo;
					else
						B[1] = lo+1;
				}
			}else {
				if(A[lo+1]>A[lo+2]) {
					B[0] = lo+1;
					if(A[lo+2]>A[lo])
						B[1] = lo+2;
					else
						B[1] = lo;
				}else {
					B[0] =lo+2;
					if(A[lo]>A[lo+1])
						B[1] = lo;
					else
						B[1] = lo+1;
				}
			}
			return;
		}
			
		
		int m = (lo+hi)>>1;
		int[] B1 = new int[2];
		max2(A,lo,m,B1);
		int[] B2 = new int[2]; 
		max2(A,m,hi,B2);
		
		if(A[B1[0]]>A[B2[0]]) {
			B[0] = B1[0];
			B[1] = (A[B1[1]]>A[B2[0]])?B1[1]:B2[0];
		}
		else
		{
			B[0] = B2[0];
			B[1] = (A[B2[1]]>A[B1[0]])?B2[1]:B1[0];
		}
		
	}

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值