算法day1 常见排序算法
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位置的数和最小值 } }
下一篇:
机器学习—数据挖掘之灰色预测算法