1.工具类的准备,拿到随机数组,封装简易方法
public class Utils {
public static int[] getArray(int size,int min,int max){
Random random = new Random();
int[] arr = random.ints(size,min,max).toArray();
return arr;
}
public static void swapPuTong(int[] arr,int i,int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
/*
异或:相同为0,不同为1,相当于无进位相加
性质:0^N = N N ^ N = 0
满足交换律和结合律
*/
//交换,借助异或运算的实现,这个函数成功的前提是两个交换变量的值可以相同,但内存不可以相同,意思就是i位置不可以等于j位置,否则会将该位置的数抹为0
public static void swapYiHuo(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
}
2.冒泡排序 时间复杂度O(N^2) 空间复杂度O(1)
思路简述:首先在0到n上作第一重循环,循环内部,从0到n上相邻元素比较,比较完后最后一个元素最大,然后0到n-1上比较,0到n-2上比较。。。。
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2)
return;
for (int e = arr.length-1; e > 0; e--) { //总0到n上轮回
for (int i = 0; i < e; i++) { //第一次从0到n上比较,比较玩最后一个最大,第二次从0到n-1上比较,比较完后N-1位置第二大。。。。
if (arr[i] > arr[i + 1]) {
Utils.swapYiHuo(arr, i, i + 1);
}
}
}
}
3.插入排序 时间复杂度O(N^2) ,这里复杂度均是按照最查情况来估计
思路简述:首先第一个元素已经有序,然后我们要做到前两个元素有序,前三个元素有序。。。直到前n个元素都有序
public static void insertionSort(int[] arr) {
if (arr == null || arr.length < 2)
return;
for (int i = 0; i < arr.length; i++) { //想要0 --i 范围做到有序
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) //从i位置往前看,已经做到0 - i-1位置有序了,如果前面的数比你大,则你往前移动然后继续与你前面的比较,直到你前面的数比你小或者越界停
Utils.swapYiHuo(arr, j, j + 1);
}
}
4.选择排序 时间复杂度O(N^2)
思路简述:选出0到n位置上的最小值放到0位置,选出1到n位置上的最小值放到1位置,选出2到n位置上的最小值放到2位置。。。。
public static void selectionSort(int[] arr) {
if (arr == null || arr.length < 2) { //洗掉捣乱参数
return;
}
for (int i = 0; i < arr.length - 1; i++) { // i -- N-1
int minIndex = i; //假定最开始最小值就是i位置
for (int j = i + 1; j < arr.length; j++) { // i+1 -- N上寻找是否有比MinIndex上更小的值
minIndex = arr[j] < arr[minIndex] ? j : minIndex; //如果有,更换最小值的坐标
}
Utils.swapPuTong(arr, i, minIndex); //交换i位置的数和最小值
}
}