栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

六大排序复习

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

六大排序复习

七大排序时间、空间复杂度及稳定性

一、选择排序

找出当前元素到末尾元素最小值.放在当前区间首位。

代码如下:

 public static void selectSort(int[] arr){
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;
            for (int j = i + 1; j < arr.length; j++) {
                if(arr[min] > arr[j]){
                    min = j;
                }
            }
            swap(arr,min,i);
        }
    }

下面代码对上述代码性能进行优化:

public static void selectSortOP(int[] arr){
        int left = 0;
        int right = arr.length - 1;
        while(left < right){
            int min = left;
            int max = left;
            for (int i = left + 1; i <= right; i++) {
                if(arr[min] > arr[i]){
                    min = i;
                }
                if(arr[max] < arr[i]){
                    max = i;
                }
            }
            swap(arr,left,min);
            if(max == left){
                max = min;
            }
            swap(arr,max,right);
            left++;
            right--;
        }
    }
二、插入排序

依次排序数组首个元素到当前位置元素

public static void insertionSort(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            for (int j = i; j > 0; j--) {
                if(arr[j] < arr[j - 1]){
                    swap(arr,j,j - 1);
                }
            }
        }
    }

将上述代码进行优化得;

public static void insertionSortBS(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            int tmp = arr[i];
            int left = 0;
            int right = i;
            while(left < right){
                int mid = left + (right - left) / 2;
                if(arr[mid] > tmp){
                    right = mid;
                }else{
                    left = mid + 1;
                }
            }
            for (int j = i; j > left; j--) {
                arr[j] = arr[j - 1];
            }
            arr[left] = tmp;
        }
    }
三、堆排序

将数组看做一个二叉树,将最大元素放置首位,开始逐一下沉,完成排序

 public static void  pushSort(int[] arr){
        for (int i = (arr.length - 1 - 1) / 2; i >= 0; i--) {
            shiftDown(arr,i,arr.length);
        }

        for (int i = arr.length - 1; i > 0; i--) {
            swap(arr,0,i);
            shiftDown(arr,0,i);
        }
    }
    private static void shiftDown(int[] arr, int i, int length) {
        while(2 * i + 1 < length){
            int j = 2 * i + 1;
            if(j + 1 < length && arr[j] < arr[j + 1]){
                j = j + 1;
            }
            if(arr[i] > arr[j]){
                break;
            }else{
                swap(arr,i,j);
            }
            i = j;
        }
    }
四、希尔排序
public static void shellSort(int[] arr){
        int gap = arr.length / 2;
        while(gap > 1){
            insertionSortGap(arr,gap);
            gap = gap >> 1;
        }
        insertionSortGap(arr,1);
    }
    private static void insertionSortGap(int[] arr, int gap) {
        for (int i = gap; i < arr.length; i++) {
            for (int j = i; j - gap >= 0 && arr[j] < arr[j - gap]; j = j - gap) {
                swap(arr,j,j - gap);
            }
        }
    }
五、归并排序
public static void mergeSort(int[] arr){
        mergeSortInternal(arr,0, arr.length - 1);
    }
    private static void mergeSortInternal(int[] arr, int left, int right) {
        if(left >= right){
            return;
        }
        int mid = left + (right - left) / 2;
        mergeSortInternal(arr,left,mid);
        mergeSortInternal(arr,mid + 1,right);
        merge(arr,left,mid,right);
    }
    private static void merge(int[] arr, int left, int mid, int right) {
        int[] tmpArr = new int[right - left + 1];
        for (int i = 0; i < tmpArr.length; i++) {
            tmpArr[i] = arr[left + i];
        }
        int i = left;
        int j = mid + 1;
        for (int k = i; k <= right; k++) {
            if(i > mid){
                arr[k] = tmpArr[j - left];
                j++;
            }else if(j > right){
                arr[k] = tmpArr[i - left];
                i++;
            }else if(tmpArr[i - left] > tmpArr[j - left]){
                arr[k] = tmpArr[j - left];
                j++;
            }else{
                arr[k] = tmpArr[i - left];
                i++;
            }
        }
    }
六、快排

一路快排

public static void quickSort1(int[] arr){
        quickSort1Helper(arr,0,arr.length - 1);
    }
    private static void quickSort1Helper(int[] arr, int left, int right) {
        int x = left + (right - left) / 2;
        swap(arr,x,left);
        if(right - left <= 2){
            //更高效的处理
            insertionSort(arr);
            return;
        }
        int p = partition(arr,left,right);
        quickSort1Helper(arr,left,p - 1);
        quickSort1Helper(arr, p + 1, right);
    }
    private static int partition(int[] arr, int left, int right) {
        int val = arr[left];
        int j = left;
        for (int i = left + 1; i <= right; i++) {
            if(arr[i] < val){
                swap(arr,i,j + 1);
                j++;
            }
        }
        swap(arr,left,j);
        return j;
    }

二路快排

public static void quickSort2(int[] arr){
        quickSort2helper(arr,0,arr.length - 1);
    }
    private static void quickSort2helper(int[] arr, int l, int r) {
        if(l >= r){
            return;
        }
        int p = partition2(arr,l,r);
        quickSort2helper(arr,l,p - 1);
        quickSort2helper(arr,p + 1,r);
    }
    private static int partition2(int[] arr, int l, int r) {
        int x = l + (r - l) / 2;
        swap(arr,l,x);
        int val = arr[l];
        int i = l + 1;
        int j = r;
        while(true){
            while(i <= j && arr[i] < val){
                i++;
            }
            while(i <= j && arr[j] > val){
                j--;
            }
            if(i > j){
                break;
            }
            swap(arr,i,j);
            i++;
            j--;
        }
        swap(arr,l,j);
        return j;
    }

三路快排

public static void quickSort3(int[] arr){
        quickSort3helper(arr,0,arr.length - 1);
    }
    private static void quickSort3helper(int[] arr, int l, int r) {
        if(l >= r){
            return;
        }
        int p = partition3(arr,l,r);
        quickSort3helper(arr,l,p - 1);
        quickSort3helper(arr,p + 1,r);
    }
    private static int partition3(int[] arr, int l, int r) {
        int x = l + (r - l) / 2;
        swap(arr,l,x);
        int lt = l;
        int i = l;
        int gt = r + 1;
        int val = arr[l];
        while(i < gt){
            if(arr[i] < val){
                swap(arr,lt + 1,i);
                lt++;
                i++;
            }else if(arr[i] > val){
                swap(arr,gt - 1,i);
                gt--;
            }else{
                i++;
            }
        }
        swap(arr,l,gt - 1);
        return gt - 1;
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1021253.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号