选择排序
选择排序的思想很简单,特别容易理解,先找到整个数组中最小的数字,将它和第一个数字交换位置,一轮循环结束;第二轮在剩余的数中找到一个最小值,并将其与数组中的第二个数字交换位置,以此类推…
插入排序
与选择排序一样,当前要插入的索引位置之前的数字都是有序的;不同的是 插入排序所需的时间取决于输入数字的顺序。插入排序不是交换数字的顺序,而是将插入位置后面的原元素全部向后移动。
最好的是顺序,时间复杂度为O(N),如果为逆序的话 这是最糟糕的情况 O(N2)。
以上版权声明:本文为CSDN博主「亓苏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Amethyst128/article/details/73500040
public static void sort(int[] arr) {
if (arr==null||arr.length <2){
return;
}
for (int i = 0; i < arr.length; i++) {
for (int j = i-1; j >=0&&arr[j]>arr[j+1] ; j--) {
swap(arr,j, j+1);
}
}
}
这里有一个很巧的点,就是j=i-1,这里就巧在不用担心数组越界了,它每次都是和上一个比较,而上一个数是必定存在的。
对数器:是一个需要自己编写的测试算法的工具,以下是相关文章
https://blog.csdn.net/u011679785/article/details/97117250
位运算比乘除运算快
异或运算^
n^ n=0 n^0=n
交换操作(骚操作,还是不用好)
不需要额外变量(保证两个变量内存不一样,值可以一样)
原因:n ^ n=0;
a 和 b看成两个东西,值一样并不影响
a=a ^ b; //甲 ^ 乙
b=a ^ b; // 甲 ^乙 ^ 乙
a=a ^ b; // 甲 ^ 乙 ^ 甲
算法题1:将一个int型的数的最右边的 1取出来,如 100100 (2) 取出来就是 100 (2);
解法:N &(~N + 1)
~ N 将N取反
算法题2:一个数组arr中有两种数出现了奇数次,其它的为偶数次,求出这两个数。
解法:
1、将数组异或得到a ^ b;
2、得到最右边的1;(说明a 和 b 在这位n上不同)
3、将arr分为两个部分(在n位置上不同的两部分)
4、分别异或得到a、b;
public void printAB(int[] arr){
int eor=0;
for (int i = 0; i < arr.length; i++) {
eor ^=arr[i];
}
int rightOne=eor & (~ eor +1);//取最右侧的1
int onlyOen =0;
for (int i = 0; i < arr.length; i++) {
if( (arr[i] & rightOne) !=0){
onlyOen ^= arr[i];
}
}
int a=onlyOen;
int b=eor ^ onlyOen;
}
算法题3:求出一个int型整数n的2进制数的1的个数
解法:
- 求出最右边的1;onlyone=N &(~N + 1)
- conut++;
- 去掉n的最右边的1;n ^= onlyone