• 排序算法


    1.归并排序  时间复杂度 平均情况与最坏情况为 O(nlog(n))

    public class MergeSort {
        //将一个数组中的两个有序区间[p,q]和(q,r]合成为一个有序区间[p,r]
        //没有返回值也可,因为数组传的是引用
        public int[] merge(int a[],int p,int q,int r){
            //新建两个数组分别存放这两个有序区间
            int[] b = new int[q-p+1];
            int[] d = new int[r-q];
            for(int i = p,k = 0;i<q+1;i++,k++){
                b[k] = a[i];
            }
            for(int i = q+1,k = 0;i<r+1;i++,k++){
                d[k] = a[i];
            }
            int i =0, j =0;
            while(i!=b.length&&j!=d.length){
                if(b[i]<d[j]){
                    a[p] = b[i];
                    i++;
                }else{
                    a[p] = d[j];
                    j++;
                }
                p++;
            }
            //数组中剩余的部分,只用复制左半部分的剩余,因为右半部份已经在目标数组中
            if(i!=b.length){
                for(int l = i;l<b.length;l++,p++){
                    a[p] = b[l];
                }
            }
            return a;
        }
        public int[] mergeSortF(int nums[],int a,int b){
            //a==b时,表示只有一个元素,则不用进行排序,此时就是递归的终结条件
            if(a<b){
                mergeSortF(nums,a,(a+b)/2);
                mergeSortF(nums,1+(a+b)/2,b);
                return merge(nums,a,(a+b)/2,b);
            }else
                return null;
        }
        //没有返回值也可,因为数组传的是引用
    /*    public void mergeSortF(int nums[],int a,int b){
            if(a<b){
                mergeSortF(nums,a,(a+b)/2);
                mergeSortF(nums,1+(a+b)/2,b);
                merge(nums,a,(a+b)/2,b);
            }
        }*/
        public static void main(String[] args){
            MergeSort m = new MergeSort();
            int[] a = {6,1,2,4,5,0,3};
            int[] b = {2,3,5,7,8,10,15};
            int[] c = m.mergeSortF(a,0,6);
            for(int i =0;i<c.length;i++){
                System.out.print(c[i]+" ");
            }
        }
    }
    View Code

     2.快速排序 时间复杂度 平均情况为 O(nlog(n)),最坏情况为O(n^2),因为所取基准值不一定是中位数,空间复杂度  O(log(n))

    public class QuickSort {
        public void quickSort(int[] array, int left, int right) {
            int index = partion(array, left, right);
            if (left < index - 1)
                quickSort(array, left, index - 1);//比较左半部分
            if (index < right)
                quickSort(array, index, right);//比较右半部份
        }
        public int partion (int[] array, int left, int right) {
            //找到一个比较的基准值,这里不一定要是中间的数,可以是任意一个范围内数
            int pivot = array[(left + right) / 2];
            while (left <= right) {
                while (array[left] < pivot) left++;
                while (array[right] > pivot) right--;
                if (left <= right) {
                    swap(array, left, right);
                    left++;
                    right--;
                }
            }
            return left;//left往左是小于(/等于)pivot的,往右是大于(/等于)pivot的
        }
        public void swap (int[] array, int left, int right) {
            int temp = array[left];
            array[left] = array[right];
            array[right] = temp;
        }
        public static void main(String[] args){
            QuickSort m = new QuickSort();
            int[] a = {20,1,20,0,5,8,0};
            int[] b = {2,3,5,7,8,10,15};
            m.quickSort(a,0,6);
            for(int i =0;i<a.length;i++){
                System.out.print(a[i]+" ");
            }
        }    
    }
    View Code
  • 相关阅读:
    python 3字符编码
    python 数据类型 datatype
    部署python django程序
    linux centos7安装python3
    关于mysql数据库优化
    关于bottle WEB框架中签名cookie的一点理解
    1111
    bottle框架剖析
    the difference __str__ and __repr__
    property getitem setitem
  • 原文地址:https://www.cnblogs.com/fisherinbox/p/5664028.html
Copyright © 2020-2023  润新知