1、选择排序:每次选择数组中的最小的数,第一轮放在数组下标为0的位置,第二轮放在数组下标为1的位置,
也就是拿数组0位置和0以后的位置比较,拿数组为1位置和1以后的位置比较,以此方法进行排序。
时间复杂度为O(n^2)
public static void selectSort(int arr[]){ if(arr == null || arr.length < 2){ return; } for (int i=0;i<arr.length;i++){ int minIndex=i; for(int j=i+1;j<arr.length;j++){ minIndex = arr[j]<arr[minIndex] ? j:i; } swap(arr,i,minIndex); } } public static void swap(int arr[],int i,int j){ int temp = 0; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
2、冒泡排序:此排序每一次的遍历是将数组中最大的数放在数组的最后,直到所有的数排序完。
时间复杂度为O(n^2)
//冒泡排序 public static void bubbleSort(int arr[]){ for(int i=0;i<arr.length;i++){ for(int j=0;j<arr.length-i-1;j++){ if(arr[j]>arr[j+1]){ swap(arr,j,j+1); } } } } public static void swap(int arr[],int i,int j){ int temp = 0; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
3、异或运算的面试题目:
//在只有一种数为奇数的数组中,求出这个数 public static void one(int arr[]){ int onlyOne = 0; for (int ar : arr){ onlyOne^=ar; } System.out.println(onlyOne); } //在有两种数为奇数的数组中,求出这两个数分别是什么 public static void tow(int arr[]){ int onlyTow = 0; for (int ar:arr){ onlyTow^=ar; } int onlyTow2 = 0; //~按位去反运算符,此时为了求出两个奇数的第一位不同的位 int err1 = onlyTow & (~onlyTow+1); for(int ar:arr){ if((err1 & ar) ==0){ onlyTow2^=ar; } } System.out.println(onlyTow2+":"+(onlyTow^onlyTow2)); }
4、插入排序:从前往后,每次都是拿此数和它左边所有的数比较,如果小,则交换位置,再比较,直到左边没有比它小的数
public class ex { public static void insertSort(int arr[]) { for(int i=1;i<arr.length;i++) { for(int j=i;j>0 && arr[j-1]>arr[j];j--) { sw(arr,j,j-1); } } } private static void sw(int[] arr, int j, int i) { arr[j] = arr[j]^arr[i]; arr[i] = arr[j]^arr[i]; arr[j] = arr[j]^arr[i]; } }
5、二分法:每次砍一半,直到直到找到对应的数
① 查找一个有序数组中的一个数:二分找到就返回
②查找一个有序数组中<=一个数的最左侧位置的数:二分到最后一个数
③对数器