zoukankan      html  css  js  c++  java
  • 算法系列二:排序

    一.快排:

    1.代码:

    package com.inspire.jdk.caculate;
    
    /**
     * Created by
     */
    public class QuickSort {
    
        public static void main(String[] args) {
    
            int[] a = new int[]{2,7,4,5,10,1,9,3,8,6};
            sort(a,0,a.length-1);
    
            for (int i = 0; i < a.length; i++) {
                System.out.print(a[i]);
            }
    
        }
    
        /**
         * 将数组的某一段元素进行划分,小的在左边,大的在右边,
         * @param data
         * @param start
         * @param end
         * @return
         */
        public static int divide(int[] data,int start,int end){
            //每次都以最右边的元素为基准值
            int base = data[end];
            //start一旦等于end,说明左右两个指针合并到了同一个位置,结束此轮循环
            while (start<end){
    
                while (start< end && data[start] <= base)
                    //从左边开始遍历,如果比基准值小,继续向右走
                    start++;
                //当while循环结束时,说明当前的data[start]比基准值大,应该进行交换
                if(start < end){
                    //交换
                    int temp = data[start];
                    data[start] = data[end];
                    data[end] = temp;
                    //交换后,被调换的值调到了基准值的右边,因此右边同时向前移动一位
                    end--;
                }
                while (start < end && data[end] >= base)
                    end--;
                if(start < end){
                    int temp = data[start];
                    data[start] = data[end];
                    data[end] = temp;
                    start++;
                }
            }
            //返回start,end都可以.此时start和end都为基准值所在的位置
            return end;
    
        }
    
        /**
         * 排序
         * @param data
         * @param start
         * @param end
         */
        public static void sort(int[] data,int start,int end){
            if (start > end){
                //如果只有一个元素就不用排序了
                return;
            }else {
                int position = divide(data,start,end);
                sort(data,start,position-1);
                sort(data,position+1,end);
            }
        }
    }

    二.归并排序

    1.代码:

    package com.inspire.jdk.caculate;
    
    import java.util.Arrays;
    
    /**
     * Created by
     * 归并算法原理:
     * 1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
     (2)设定两个指针,最初位置分别为两个已经排序序列的起始位置
     (3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
     (4)重复步骤3直到某一指针达到序列尾
     (5)将另一序列剩下的所有元素直接复制到合并序列尾
     参考:https://blog.csdn.net/jianyuerensheng/article/details/51262984
     *
     */
    public class MergeSort {
        public static void main(String[] args) {
            int[] data = { 51, 46, 20, 18};
            mergeSort(data,0,data.length-1);
            System.out.println(Arrays.toString(data));
    
        }
    
        public static void merge(int[] data,int low,int mid,int high){
    
            //新建一个数组
            int[] temp = new int[high - low + 1];
            //左指针
            int i = low;
            //右指针
            int j = mid+1;
            int k = 0;
            //把较小的元素先移到数组中
            while (i <= mid && j <= high){
                if (data[i] < data[j]){
                    //先把左边的移动到新数组中
                    //temp[k++] = data[i++];
                    temp[k] = data[i];
                    k++;
                    i++;
                }else {
                    //先把右边的移动到新数组中
                    //temp[k++] = data[j++];
                    temp[k] = data[j];
                    k++;
                    j++;
                }
            }
            //把左边剩余的元素移动到数组中
            while (i <= mid){
                temp[k++] = data[i++];
            }
            //把右边剩余的元素移动到数组中
            while (j <= high){
                temp[k++] = data[j++];
            }
    
            //将临时数组元素拷贝到原数组
            for (int l = 0; l < temp.length; l++) {
                data[l+low] = temp[l];
            }
    
        }
    
        public static void mergeSort(int[] data,int low,int high){
    
            int mid = (low+high)/2;
            if (low < high){
                //二路归并排序里面有两个Sort,多路归并排序里面写多个Sort就可以了
                //左边
                mergeSort(data,low,mid);
                //右边
                mergeSort(data,mid+1,high);
    
                //左右归并
                merge(data,low,mid,high);
    
                System.out.println(Arrays.toString(data));
    
            }
        }
    }
  • 相关阅读:
    poj 2763 Housewife Wind
    hdu 3966 Aragorn's Story
    poj 1655 Balancing Act 求树的重心
    有上下界的网络流问题
    URAL 1277 Cops and Thieves 最小割 无向图点带权点连通度
    ZOJ 2532 Internship 网络流求关键边
    ZOJ 2760 How Many Shortest Path 最大流+floyd求最短路
    SGU 438 The Glorious Karlutka River =) 拆点+动态流+最大流
    怎么样仿写已知网址的网页?
    5-10 公路村村通 (30分)
  • 原文地址:https://www.cnblogs.com/inspred/p/9240755.html
Copyright © 2011-2022 走看看