zoukankan      html  css  js  c++  java
  • 排序算法--归并,堆,快速排序

    排序算法–归并,堆,快速排序

    归并排序

    思路:分治

    public class MergeSort {
    
        public static void main(String[] args) {
            int[] arr = {8,4,7,5,6,3,1,2};
            print(arr);
            sort(arr);
        }
    
        static void sort(int[] a){
            int mid = a.length/2;
            a = merge(Arrays.copyOfRange(a, 0, mid),Arrays.copyOfRange(a, mid, a.length));
            print(a);
        }
    
        static int[] merge(int[] a1, int[] a2){
            int[] a = new int[a1.length+a2.length];
    
            //如果数组长度大于1,则继续向下递归
            if(a1.length > 1){
                int mid = a2.length/2;
                a1 = merge(Arrays.copyOfRange(a1, 0, mid),Arrays.copyOfRange(a1, mid, a1.length) );
            }
            if(a2.length > 1){
                int mid = a2.length/2;
                a2 = merge(Arrays.copyOfRange(a2, 0, mid),Arrays.copyOfRange(a2, mid, a2.length) );
            }
    
            //如果两个数组长度等于1或者数组已经经过归并排序,则合并两个数组
            int i = 0, j = 0;
    
            //合并两个有序数组
            while (i < a1.length && j < a2.length){
                if(a1[i] <= a2[j]){
                    a[i+j] = a1[i++];
                }else {
                    a[i+j] = a2[j++];
                }
            }
    
            //将未排完的数组添加再合并数组的后面
            while (i < a1.length){
                a[i+j] = a1[i++];
            }
            while (j < a2.length){
                a[i+j] = a2[j++];
            }
    
            print(a);
    
            return a;
        }
    
        static void print(int[] a){
            for (int i : a) {
                System.out.print(i + " ");
            }
            System.out.println("
    ");
        }
    }
    

    快速排序

    经典快速排序总是指定数组或者某部分的最后一个元素作为基准值,随机快速排序指定数组或者某一部分中的随机值作为基准值。

    public class QuickSort {
    
        public static void main(String[] args) {
            int[] arr = {5,3,7,9,10,2,2,3};
            print(arr);
            sort(arr, 0, arr.length-1);
        }
    
        static void sort(int[] a, int l, int r){
    
            if(l >= r) {
                return;
            }
    
            int[] index = partition(a, l, r);
            //递归排序左右两部分
            sort(a, l, index[0]-1);
            sort(a, index[1]+1, r);
    
        }
    
        /**
         *
         * @param a 数组
         * @param l 左边界
         * @param r 右边界
         * @return 返回小于基准值的和大于基准值的边界
         */
        static int[] partition(int[] a, int l, int r){
            //less ,more分别表示小于和大于基准值的边界。
            // 他们中间的表示等于基准值,取最右边为基准值
            int less = l, more = r;
            int p = a[r];
            while (l <= more){
                if(a[l] > p){
                    swap(a, l, more--);
                }else if(a[l] < p){
                    swap(a, l++, less++);
                }else {
                    l++;
                }
            }
            print(a);
            return new int[]{less, more};
        }
    
        static void swap(int[] a, int i, int j){
            if (i == j) {
                return;
            }
            a[i] = a[i]+a[j];
            a[j] = a[i]-a[j];
            a[i] = a[i]-a[j];
        }
    
        static void print(int[] a){
            for (int i : a) {
                System.out.print(i + " ");
            }
            System.out.println("
    ");
        }
    }
    

    因为我喜欢追寻过程中的自己
  • 相关阅读:
    Unity学习
    C#文件操作
    Unity3D XLua热更新流程
    Unity编辑器扩展
    Unity性能优化
    Unity热更新 xLua
    Unity热更新 AssetBundle
    Quickcocos从安装到打包
    EasyTouch5插件使用 EasyTouch手势检测功能
    PHP CURL HTTPS内存泄露问题
  • 原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359759.html
Copyright © 2011-2022 走看看