zoukankan      html  css  js  c++  java
  • 排序算法之 Java改进版快速排序算法

    package net.qh.test.sort;
    
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.List;
    
    /**
     * Created by Administrator on 2016/03/01.
     */
    public class ProSimpleQuick {
    
        public int[] sort(int[] arr,int left,int right){
            if ( arr == null || arr.length <= 1 ){
                return arr;
            }
            if(right - left >= 9 ){
                int i = left;
                int j = right;
                int mid = (left + right) / 2;
                if(arr[i] > arr[mid]){
                    int temp = arr[i];
                    arr[i] = arr[mid];
                    arr[mid] = temp;
                }
                if(arr[i] > arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
                if(arr[mid] > arr[j]){
                    int temp = arr[mid];
                    arr[mid] = arr[j];
                    arr[j] = temp;
                }
                int temp = arr[mid];
                arr[mid] = arr[right - 1];
                arr[right - 1] = temp;
    
                int k = i;
                int l = right - 1;
                int m = k;
                int n = l - 1;
                while(true){
                    while(m < l){
                        if(arr[m] > arr[l]){
                            break;
                        }
                        m++;
                    }
                    while(k < n){
                        if(arr[n] < arr[l]){
                            break;
                        }
                        n--;
                    }
                    if(m >= n) break;
                    int tem = arr[m];
                    arr[m] = arr[n];
                    arr[n] = tem;
                }
                int tem = arr[l];
                arr[l] = arr[m];
                arr[m] = tem;
                sort(arr,left,m - 1);
                sort(arr,m + 1, right);
            }else {
                int i = left + 1;
                int j = right;
                for ( ; i <= j; i++){
                    int k = i - 1;
                    int temp = arr[i];
                    while(true){
                        if(arr[k] > arr[i]){
                            arr[k + 1] = arr[k];
                        }else{
                            break;
                        }
                        arr[k] = temp;
                        k--;
                    }
                }
            }
            return arr;
        }
    
    
        public static void main(String[] args){
    
            List<Integer> intList = new ArrayList<Integer>();
            for(int i = 0; i < 100000; i++){
                intList.add(100000 - i);
            }
            int[] arr = new int[intList.size()];
            for(int j = 0; j < arr.length; j++){
                arr[j] = intList.get(j);
            }
            for(int temp : arr){
                System.out.print(temp + ", ");
            }
            System.out.println("");
            long start = Calendar.getInstance().getTimeInMillis();
            arr = new ProSimpleQuick().sort(arr,0,arr.length-1);
            long end = Calendar.getInstance().getTimeInMillis();
            System.out.println("所需毫秒:" + (end - start));
            for(int temp : arr){
                System.out.print(temp + ", ");
            }
        }
    
        /**
             1. 该快速排序法是对简单快速排序法的一个改进。
             2. 当数组的数量小于10的时候,拒绝使用快速排序,使用插入法排序。这样做提高了性能,有效减少了栈溢出的概率。
             3. 基准的选择不再盲目性: arr[left] <= arr[mid] <= arr[right],交换, arr[mid]和arr[right],基准为:arr[right].
             4. 实战测试:4核CPU和8G内存下,对100000个整型元素的数组排序, 逆序需要 20 毫秒, 有序需要:23 毫秒
         */
    
    }
    

      

  • 相关阅读:
    关于MySQL中ALTER TABLE 的命令用法——SQL
    replace函数——SQL
    SQL构造一个触发器
    【视频转换】监控视频DAV转mp4
    【pyqt5+opencv】如何将大量图片合成一张图
    【OpenCV+pyqt5】视频抽帧裁剪与图片转视频
    【Caffe】生成数据之修改label
    【labelme】标注工具Trick
    【OpenCV+pyqt5】视频抽帧相关操作
    【pyqt5】Pyinstaller封装OpenCV异常
  • 原文地址:https://www.cnblogs.com/aDiot/p/5232644.html
Copyright © 2011-2022 走看看