常见排序复习(java)

163 阅读2分钟

1、快速排序

// 时间复杂度:O(nlogn)
private static void quickSort(int[] arr,int start,int end) {
    // 递归出口
    if(arr==null && start>=end && arr.length<=1) {
        return;
    }
    // 调用分治方法
    int mid = partition(arr,start,end);
    quickSort(arr,start,mid);
    quickSort(arr,mid+1,end);
}

private static int partition(int[] arr,int start,int end){
    // 选出一个值当基准数据,然后遍历比较,大的放一端,小的放另一端
    int base = arr[start]; //挖坑 arr[start] 
    while(start<end){
        while(start<end && arr[end]>=base) {
            --end;
        }
        if(start<end) {
            arr[start] = arr[end]; // 填坑arr[start],但是出现了新坑arr[end]
            ++start;
        }
        // 在前面找到比base小的数据
        while(start<end && arr[start]<=base) {
            ++start;
        }
        if(start<end) {
            arr[end] = arr[start];
            --end;
        }
    }
    arr[start] = base;
    return start;
}

2、冒泡排序

// 时间复杂度:O(n²)
private static void bubbleSort(int[] arr){
    if(arr==null) {
        return;
    }
    // 每一趟循环,将最值浮到最上面,想象冒泡的场景 
    int temp;
    boolean isSorted;
    for(int i=0; i<arr.length-1; i++) {
        isSorted = true; 
        for(int j=1; j<arr.length-i; j++) {
            if(arr[j-1] > arr[j]) {
                temp = arr[j-1];
                arr[j-1] = arr[j];
                arr[j] = temp;
                isSorted = false;
            }
        }
        if(isSorted) { 
        // 没有数据交换,说明已经排序好了数据,没必要再循环
            break;
        }
    }
}

3、选择排序

// 时间复杂度:O(n²)
private static void selectionSort(int[] arr) {
    if(arr==null) {
        return;
    }
    int i,j,min,len = arr.length;
    // 每一趟循环要找到最小值的坐标
    for(i=0; i<len-1; i++) {
        min = i;
        for(j=i+1; j<len; j++) {
            if(arr[j] < arr[min] ) {
                min = j;
            }
        }
        if(min!=i) {
            int temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }
}

4、插入排序

// 时间复杂度:O(n²)
private static void insertionSort(int[] arr) {
    if(arr==null) {
        return;
    }
    int insertValue;
    int j;
    for(int i=1; i<arr.length; i++) {
        // 取出待插入比较的数据
        insertValue = arr[i];
        j=i;
        // 待插入数据的下标之前的数据和待插入数据比较,满足条件移位
        while(j>0 && arr[j-1] > insertValue) {
            arr[j] = arr[j-1];
            j--;
        }
        arr[j] = insertValue
    }
}