认识时间复杂度和简单的排序算法

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;
        //~按位去反运算符,此时为了求出两个奇数的第一位不同的位,可以这样理解,两个不同的数进行异或运算,在同一进制位置上的数如果两个数的数值不同,异或运算的结果一定是1
        //所以下面的操作,是为了找到从右边往左去的第一个不相同的位置,并得到这个数,这个数和两个数中的一个数进行&运算,一定是0,和另一个数&运算,不为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、二分法:每次砍一半,直到直到找到对应的数
① 查找一个有序数组中的一个数:二分找到就返回

②查找一个有序数组中<=一个数的最左侧位置的数:二分到最后一个数

③对数器

posted @ 2021-12-30 07:00  刘小呆  阅读(140)  评论(0编辑  收藏  举报