java学习day06

今天来学习排序吧
使用异或交换数据值原理:https://blog.csdn.net/borefo/article/details/4622288
使用异或交换注意判断两个数是否相同,相同则不能用异或:https://blog.csdn.net/u010141928/article/details/76140165

冒泡排序:

从第一个开始和后面比较,比较整数次数(外层循环)为arr.length-1次,每个值比较的次数(内层循环)为arr.length-1-i次,内层循环不能从1开始(可以但没必要)。

public static void BubbleSort(int[] arr){
		for(int i = 0; i<arr.length-1; i++){
			for(int j = 0; j<arr.length-1-i; j++){
				if(arr[j]>arr[j+1]) {
				//使用异或对数值进行交换,由于已经判断大于才进行交换,因此不需要担心数值相同的问题
					arr[j] ^= arr[j+1];
					arr[j+1] ^= arr[j];
					arr[j] ^= arr[j+1];
				}
			}
		}
	}

选择排序:

如果说冒泡排序的比较的顺序是左上角的三角形,那么选择排序的比较顺序就是右上角,因此,
从第一个开始和后面比较,比较整体次数(外层循环)为arr.length-1次,每个值比较的次数(内层循环)为arr.length-1次,内层循环不能从i开始。

public static void SelectSort(int[] arr){
		for(int i = 0; i<arr.length-1; i++){
			for(int j = i; j<arr.length-1-i; j++){
				if(arr[j]>arr[j+1]) {
					arr[j] ^= arr[j+1];
					arr[j+1] ^= arr[j];
					arr[j] ^= arr[j+1];
				}
			}
		}
	}

二分查找:

对半查找:将有序的数组对半查找某个值,值存在则返回其数组下标,注意m的值在运行过程中要改变。

public static int BinarySearch(int[] arr,int key) {
	int l = 0;
	int r = arr.length-1,m;
	while(l<=r) {
		m = (l+r)/2;
		if(arr[m]==key) {
			return m;
		}
		else if(arr[m]>key) {
			r = m-1;
		}
		else if(arr[m]<key) {
			l = m+1;
		}
	}
	return -1;
}

时间复杂度和空间复杂度
时间复杂度
我们把 算法需要执行的运算次数用输入大小n的函数表示,即T(n)。
此时为了 估算算法需要的运行时间和简化算法分析,我们引入时间复杂度的概念。
定义:存在常数c和函数f(N),使得当N >= c 时 T(N) <= f(N) ,表示为T(N) = O(f(n))。
算法的时间复杂度,用来度量算法的运行时间,记作:T(n) = 0(f(n))。它表示随着输入大小n的增大,算法执行需要的时间的增长速度可以用f(n)来描述。
注意:
1、常数项的增长速度影响不大,所以当T(n)=c,c 为一个常数的时候,我们说这个算法的时间复杂度为O(1),如果T(n)不等于一个常数项时,直接将常数项省略。
2、n^3 对速度影响远大于 n2。因此要求精度不高时直接忽略n2。

空间复杂度
一个程序的空间复杂度是指一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少个预先估计。
程序所需存储空间包括以下部分:
1)固定部分。包括指令空间和数据空间。这部分属于静态空间。
2)可变空间。包括动态分配的空间,以及递归栈所需要的空间等,这部分空间大小与算法有关。

空间复杂度:函数中创建对象的个数关于问题规模函数表达式,一般情况用O的渐进表示法表示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值