今天来学习排序吧
使用异或交换数据值原理: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的渐进表示法表示。