数据结构与算法-JAVA

124 阅读2分钟

时间复杂度

算法的时间复杂度无非就是for、while等包含起来的进本运算单元的循环次数
时间复杂度排序:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

冒泡排序

冒泡排序算法中,一次循环结束,就相当于确定了当前的最大值,也能确定最大值在数组中应存入的位置
时间复杂度:时间复杂度 O(n^2)
代码实现:

//传入一个数组的引用,将数组的元素进行升序排列
public static void bubbleSort(int[] arr){
    for (int i = 0; i < arr.length-1; i++) {
        for (int j = 0; j < arr.length - i - 1; j++) {
            if(arr[j]>arr[j+1]){
                int temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
}

快速排序

时间复杂度:O(nlogn)
方法一:步骤:
1.将第一个元素放入临时变量作为基准数,0号位置空出坑位
2.从右开始移动指针找比基准数小的,找到放入0号坑位生成新的坑位
2.从左开始移动指针找比基准数大的,放入新的坑位
4.直到两个指针指向同一个索引,即两个指针指向同一个坑位
5.基准数放入这个坑位
方法二:步骤:
1.从右开始找比基准数小的
2.从左开始找比基准数大的
3.交换两个值的位置
4.红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止
5.基准数归位
说明:最后左指针和右指针会指向同一个位置
①右靠左右边一直遍历到基准数位置,此时这个公共位置一定小于等于基准数:变换
②左靠右,左边一直遍历到右边的位置,这个位置就一定比基准数小,交换\

image.png 实现代码:

//快速排序:
public static void quickSort(int[] arr,int left,int right){
    //递归结束条件
    if(right<left){
        return;
    }
    int left0=left;
    int right0=right;
    //基准数:
    int baseNumber=arr[left];
    //每当left=right就结束一次排序
    while (left!=right){
        //从右往左找比基准数小的
        while (arr[right]>=baseNumber&&right>left){
            right--;
        }
        //从左往右找比基准数大的
        while (arr[left]<=baseNumber&&right>left){
            left++;
        }
        //此时,左右下标指向同一个位置left=right
        //交换左右两个下标位置的元素
        int temp=arr[left];
        arr[left]=arr[right];
        arr[right]=temp;
    }
    //每交换一次后基准数归位
    int temp=arr[left];
    arr[left]=arr[left0];
    arr[left0]=temp;
    //递归调用
    quickSort(arr,left0,left-1);
    quickSort(arr,left+1,right0);
}

折半查找(二分查找)

必须是有序数组,从小到大排列好
时间复杂度:log2n,(是以2为底,n的对数)
代码实现:

//传入一个有序(从小到大排列)数组和一个数值,返回这个数值在数组中的下标,如果不存在,返回-1
public static int bynarySearch(int[] arr,int x){
    int low=0;
    int high=arr.length-1;
    while (low<=high){
        int middle=(low+high)/2;
        if(arr[middle]==x){
            return middle;
        }else if(arr[middle]>x){
            high=middle-1;
        }else if(arr[middle]<x){
            low=middle+1;
        }
    }
    return -1;
}