zoukankan      html  css  js  c++  java
  • java 实现排序

    package com.cjs.sort;
    
    /**
     * 此类用来提供针对整数的各种排序算法
     * 
     * @author S
     * @version 1.0
     */
    public class MySort {
    
        /**
         * 冒泡排序来实现一系列整数的升序排列,改变了传入的数组
         * 
         * @param a
         *            传入的整形数组,对其进行排序的目标数组
         * @return void
         */
        public static void bubbleSort(int a[]) {
    
            int n = a.length;
            for (int i = 1; i <= n - 1; i++) {
                for (int j = 0; j < n - i; j++) {
                    if (a[j] > a[j + 1]) {
                        int t = a[j];
                        a[j] = a[j + 1];
                        a[j + 1] = t;
                    }
                }
            }
    
        }
        
        /**
         * 选择排序来实现一系列整数的升序排列,改变了传入的数组
         * 
         * @param a
         *            传入的整形数组,对其进行排序的目标数组
         * @return void
         */
        public static void selectSort(int[] a){
            
            int n = a.length;
        
            for(int i = 0; i < n; i++){
                int x = a[i], k = i;    
                for(int j = i+1; j < n; j++){
                    if(a[j] < x){
                        x = a[j];
                        k = j;
                    }
                }
                
                a[k] = a[i];
                a[i] = x;
            }
            
        }
        
        /**
         * 插入排序来实现一系列整数的升序排列,改变了传入的数组
         * 
         * @param a
         *            传入的整形数组,对其进行排序的目标数组
         * @return void
         */
        public static void insertSort(int[] a){
            
             int n = a.length;
             
             for(int i = 1; i < n; i++){
                 int x = a[i],k = i;
                 for(int j = i-1; j >= 0; j--){
                     if(a[j] > x){
                         a[j+1] = a[j];
                         k = j;
                     }
                 }
                 a[k] = x;
             }
            
        }
        
        
    
        static int[] temp = new int[100 * 100]; // 归并排序所用到的临时数组
    
        /**
         * 归并排序来实现一系列整数的升序排列,改变了传入的数组,所排数组的大小不能超过10000
         * 
         * @param a
         *            传入的整形数组,对其进行排序的目标数组
         * @param left
         *            传入数组的左边界下标
         * @param right
         *            传入数组的右边界下标
         * @return void
         */
        public static void mergeSort(int a[], int left, int right) {
    
            // 至少有两个元素,也是递归的结束条件
            if (left < right) {
                int mid = (left + right) / 2;
                mergeSort(a, left, mid);
                mergeSort(a, mid + 1, right);
                // 合并到临时数组temp
                Merge(a, temp, left, mid, right);
                // 复制回数组a
                Copy(a, temp, left, right);
            }
    
        }
    
        /**
         * 归并排序中的合并操作,将二分后的数组按升序排列
         * 
         * @param a
         *            传入的数组
         * @param t
         *            要合并到的临时数组
         * @param left
         *            传入数组的左边界下标
         * @param mid
         *            传入数组的中间下标
         * @param right
         *            传入数组的右边界下标
         * @return void
         */
        private static void Merge(int a[], int t[], int left, int mid, int right) {
    
            // 合并c[1:m]和c[m+1:r]到d[l,r]
            int i = left, j = mid + 1, k = left;
            // 两表中元素比较,类似于打擂台,大的复制到临时数组中
            while (i <= mid && j <= right) {
                if (a[i] < a[j]) {
                    t[k++] = a[i++];
                } else {
                    t[k++] = a[j++];
                }
            }
    
            // 若前一个子序列剩余,则直接复制入临时数组
            if (i > mid) {
                for (int q = j; q <= right; q++)
                    t[k++] = a[q];
            }
            // 后一个子序列
            else {
                for (int q = i; q <= mid; q++)
                    t[k++] = a[q];
            }
    
        }
    
        /**
         * 归并排序中的复制操作,将数据从临时数组中复制到传入的原数组
         * 
         * @param a
         *            传入的数组
         * @param t
         *            保存数据的临时数组
         * @param left
         *            传入数组的左边界下标
         * @param right
         *            传入数组的右边界下标
         * @return void
         */
        private static void Copy(int a[], int t[], int left, int right) {
    
            for (int i = left; i <= right; i++)
                a[i] = t[i];
    
        }
    
        /**
         * 快速排序来实现一系列整数的升序排列,改变了传入的数组
         * 
         * @param a
         *            传入的整形数组,对其进行排序的目标数组
         * @param left
         *            传入数组的左边界下标
         * @param right
         *            传入数组的右边界下标
         * @return void
         */
        public static void quickSort(int a[], int left, int right) {
    
            if (left < right) {
                int x = Partition(a, left, right);
                quickSort(a, left, x - 1);
                quickSort(a, x + 1, right);
            }
    
        }
    
        /**
         * 快速排序中用来对元素进行划分,基准元素为a[left]
         * 
         * @param a
         *            传入的整形数组,对其进行排序的目标数组
         * @param left
         *            传入数组的左边界下标
         * @param right
         *            传入数组的右边界下标
         * @return i 划分后基准元素所处位置的下标
         */
        private static int Partition(int[] a, int left, int right) {
    
            int x = a[left];
            int i = left, j = right;
    
            while (i < j) {
    
                while (i < j && a[j] >= x)
                    j--;
                if (i < j) {
                    a[i] = a[j];
                    i++;
                }
    
                while (i < j && a[i] < x)
                    i++;
                if (i < j) {
                    a[j] = a[i];
                    j--;
                }
    
            }
            a[i] = x;
    
            return i;
        }
    
    }

     泛型实现:

    package com.cjs.alogrithm;
    
    /**
     * 此类采用泛型方法来提供对各种类型数据的各种排序算法
     * 
     * @author S
     * @version 1.0
     */
    public class MySort {
    
        /**
         * 冒泡排序来实现一系列数据的升序排列,改变了传入的数组
         * 
         * @param a
         *            传入的存储数据的数组,对其进行排序的目标数组
         * @return void
         */
        public static <T extends Comparable<T>> void bubbleSort(T a[]) {
    
            int n = a.length;
            for (int i = 1; i <= n - 1; i++) {
                for (int j = 0; j < n - i; j++) {
                    if ((a[j]).compareTo(a[j + 1]) > 0) {
                        T t = a[j];
                        a[j] = a[j + 1];
                        a[j + 1] = t;
                    }
                }
            }
    
        }
    
        /**
         * 选择排序来实现一系列数据的升序排列,改变了传入的数组
         * 
         * @param a
         *            传入的存储数据数组,对其进行排序的目标数组
         * @return void
         */
        public static <T extends Comparable<T>> void selectSort(T[] a) {
    
            int n = a.length;
    
            for (int i = 0; i < n; i++) {
                T x = a[i];
                int k = i;
                for (int j = i + 1; j < n; j++) {
                    if (a[j].compareTo(x) < 0) {
                        x = a[j];
                        k = j;
                    }
                }
    
                a[k] = a[i];
                a[i] = x;
            }
    
        }
    
        /**
         * 插入排序来实现一系列数据的升序排列,改变了传入的数组
         * 
         * @param a
         *            传入的存储数据的数组,对其进行排序的目标数组
         * @return void
         */
        public static <T extends Comparable<T>> void insertSort(T[] a) {
    
            int n = a.length;
    
            for (int i = 1; i < n; i++) {
                T x = a[i];
                int k = i;
                for (int j = i - 1; j >= 0; j--) {
                    if (a[j].compareTo(x) > 0) {
                        a[j + 1] = a[j];
                        k = j;
                    }
                }
                a[k] = x;
            }
    
        }
    
        /**
         * 归并排序来实现一系列数据的升序排列,改变了传入的数组,需要额外提供一个临时数组来辅助排序
         * 
         * @param a
         *            传入的存储数据的数组,对其进行排序的目标数组
         * @param left
         *            传入数组的左边界下标
         * @param right
         *            传入数组的右边界下标
         * @return void
         */
        public static <T extends Comparable<T>> void mergeSort(T a[], T temp[],
                int left, int right) {
    
            // 至少有两个元素,也是递归的结束条件
            if (left < right) {
                int mid = (left + right) / 2;
                mergeSort(a, temp, left, mid);
                mergeSort(a, temp, mid + 1, right);
                // 合并到临时数组temp
                Merge(a, temp, left, mid, right);
                // 复制回数组a
                Copy(a, temp, left, right);
            }
    
        }
    
        /**
         * 归并排序中的合并操作,将二分后的数组按升序排列
         * 
         * @param a
         *            传入的数组
         * @param t
         *            要合并到的临时数组
         * @param left
         *            传入数组的左边界下标
         * @param mid
         *            传入数组的中间下标
         * @param right
         *            传入数组的右边界下标
         * @return void
         */
        private static <T extends Comparable<T>> void Merge(T a[], T t[], int left,
                int mid, int right) {
    
            // 合并c[1:m]和c[m+1:r]到d[l,r]
            int i = left, j = mid + 1, k = left;
            // 两表中元素比较,类似于打擂台,大的复制到临时数组中
            while (i <= mid && j <= right) {
                if (a[i].compareTo(a[j]) < 0) {
                    t[k++] = a[i++];
                } else {
                    t[k++] = a[j++];
                }
            }
    
            // 若前一个子序列剩余,则直接复制入临时数组
            if (i > mid) {
                for (int q = j; q <= right; q++)
                    t[k++] = a[q];
            }
            // 后一个子序列
            else {
                for (int q = i; q <= mid; q++)
                    t[k++] = a[q];
            }
    
        }
    
        /**
         * 归并排序中的复制操作,将数据从临时数组中复制到传入的原数组
         * 
         * @param a
         *            传入的数组
         * @param t
         *            保存数据的临时数组
         * @param left
         *            传入数组的左边界下标
         * @param right
         *            传入数组的右边界下标
         * @return void
         */
        private static <T extends Comparable<T>> void Copy(T a[], T t[], int left,
                int right) {
    
            for (int i = left; i <= right; i++)
                a[i] = t[i];
    
        }
    
        /**
         * 快速排序来实现一系列数据的升序排列,改变了传入的数组
         * 
         * @param a
         *            传入的存储数据的数组,对其进行排序的目标数组
         * @param left
         *            传入数组的左边界下标
         * @param right
         *            传入数组的右边界下标
         * @return void
         */
        public static <T extends Comparable<T>> void quickSort(T a[], int left,
                int right) {
    
            if (left < right) {
                int x = Partition(a, left, right);
                quickSort(a, left, x - 1);
                quickSort(a, x + 1, right);
            }
    
        }
    
        /**
         * 快速排序中用来对元素进行划分,基准元素为a[left]
         * 
         * @param a
         *            传入的存储数据的数组,对其进行排序的目标数组
         * @param left
         *            传入数组的左边界下标
         * @param right
         *            传入数组的右边界下标
         * @return i 划分后基准元素所处位置的下标
         */
        private static <T extends Comparable<T>> int Partition(T[] a, int left,
                int right) {
    
            T x = a[left];
            int i = left, j = right;
    
            while (i < j) {
    
                while (i < j && a[j].compareTo(x) >= 0)
                    j--;
                if (i < j) {
                    a[i] = a[j];
                    i++;
                }
    
                while (i < j && a[i].compareTo(x) < 0)
                    i++;
                if (i < j) {
                    a[j] = a[i];
                    j--;
                }
    
            }
            a[i] = x;
    
            return i;
        }
    
    }
  • 相关阅读:
    【语义未来】Twine和Scoutlabs揭示的冰山一角
    取舍之间:Keep Simple Keep Useful
    掌握激励组合拳的红色混混博客
    智能语义聚合框架:像人类一样收集和理解知识
    快车道不快的现象与人类误判心理学
    像Last.Fm去战斗,电台式的阅读体验?
    语义的未来【OpenSourceCamp讲稿】
    Spring 中 context:propertyplaceholder @Bean
    ${pageContext.request.contextPath}不能识别的问题
    Spring @Autowired 注解 指定自动装配
  • 原文地址:https://www.cnblogs.com/cjshuang/p/5320479.html
Copyright © 2011-2022 走看看