zoukankan      html  css  js  c++  java
  • 稳定的算法用于对象排序

    稳定的算法用于对象排序

    插入与归并等,稳定算法用于对象排序

    在这里插入图片描述


    插入排序

    package com.m.algorithm;
    
    import java.util.Arrays;
    
    public class Test {
    	/**
    	深入学习排序算法的思路
    	
    	 * 冒泡 选择
    	 * 
    	 * 插入(二分) O(n^2) 归并(多路)
    	 * 
    	 * 希尔 堆排 快排
    	 * 
    	 * 计数 桶排 基数
    	 * 
    	 * 
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		int[] arr = { 64, 76, 36, 34, 6, 2, 74, 23 };
    		long start = System.currentTimeMillis();
    		insertSort(arr);
    		System.out.println(System.currentTimeMillis()-start);
    	}
    
    	public static void insertSort(int[] arr1) {
    //		int[] arr1 = { 1, 3, 5, -2 };
    		for (int i = 0; i < arr1.length-1; i++) {
    			int end = i+1;
    			while(end>0 && arr1[end] < arr1[end-1]) {
    				int t = arr1[end];
    				arr1[end] = arr1[end-1];
    				arr1[end-1] = t;
    				end--;
    			}
    		}
    		
    		System.out.println(Arrays.toString(arr1));
    	}
    }
    
    



    归并排序

    package com.m.algorithm;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Random;
    
    public class Test {
    	
    	private List<Integer> arrayTemp;
    	
    	public Test(List<Integer> arrayTemp) {
    		this.arrayTemp = arrayTemp;
    	}
    	
    	public void mergeSort(List<Integer> arrayList,int left,int right) {
    		//1、
    		if(left < right) {
    			int mid = left + (right-left)/2;
    			//左分
    			mergeSort(arrayList, left, mid);
    			//右分
    			mergeSort(arrayList, mid+1, right);
    			//合并
    			merge(arrayList,left,mid,right);
    		}
    	}
    	
    	
    	public void merge(List<Integer> arrayList,int left,int mid,int right) {
    		int index = 0;
    		int i = left;
    		int j = mid+1;
    		
    		while(i<=mid && j<=right) {
    			if(arrayList.get(i) < arrayList.get(j)) {
    				this.arrayTemp.set(index++, arrayList.get(i++));
    			}else {
    				this.arrayTemp.set(index++, arrayList.get(j++));
    			}
    		}
    		
    		while(i<=mid) {
    			this.arrayTemp.set(index++, arrayList.get(i++));
    		}
    		
    		while(j<=right) {
    			this.arrayTemp.set(index++, arrayList.get(j++));
    		}
    		
    		index = 0;
    		while(left <= right) {
    			arrayList.set(left++, this.arrayTemp.get(index++));
    		}
    		
    	}
    }
    
    
    
    
    
    



    插入与归并的JDK的应用

    归并的应用-对象排序

    Arrays.sort(T[] a, Comparator<? super T> c)的JDK源码 ;

    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }
    
    /** To be removed in a future release. */
    private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
        T[] aux = a.clone();
        if (c==null)
            mergeSort(aux, a, 0, a.length, 0);
        else
            mergeSort(aux, a, 0, a.length, 0, c);
    }
    

    TimSort.sort(a, 0, a.length, c, null, 0, 0)的源码

      static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c,
                             T[] work, int workBase, int workLen) {
            assert c != null && a != null && lo >= 0 && lo <= hi && hi <= a.length;
    
            int nRemaining  = hi - lo;
            if (nRemaining < 2)
                return;  // Arrays of size 0 and 1 are always sorted
    
            // If array is small, do a "mini-TimSort" with no merges
            if (nRemaining < MIN_MERGE) {
                int initRunLen = countRunAndMakeAscending(a, lo, hi, c);
                binarySort(a, lo, hi, lo + initRunLen, c);
                return;
            }
    
            /**
             * March over the array once, left to right, finding natural runs,
             * extending short natural runs to minRun elements, and merging runs
             * to maintain stack invariant.
             */
            TimSort<T> ts = new TimSort<>(a, c, work, workBase, workLen);
            int minRun = minRunLength(nRemaining);
            do {
                // Identify next run
                int runLen = countRunAndMakeAscending(a, lo, hi, c);
    
                // If run is short, extend to min(minRun, nRemaining)
                if (runLen < minRun) {
                    int force = nRemaining <= minRun ? nRemaining : minRun;
                    binarySort(a, lo, lo + force, lo + runLen, c);
                    runLen = force;
                }
    
                // Push run onto pending-run stack, and maybe merge
                ts.pushRun(lo, runLen);
                ts.mergeCollapse();
    
                // Advance to find next run
                lo += runLen;
                nRemaining -= runLen;
            } while (nRemaining != 0);
    
            // Merge all remaining runs to complete sort
            assert lo == hi;
            ts.mergeForceCollapse();
            assert ts.stackSize == 1;
        }
    
    
  • 相关阅读:
    个人总结08
    npm快速入门
    Activity简介
    SELinux
    正则表达式学习笔记(二)表达式的匹配原理
    git学习笔记(一)
    使用VSFTPD传输文件
    正则表达式学习笔记(一)正则表达式入门
    Linux基础(一)磁盘分区
    Shell脚本笔记(九)数组
  • 原文地址:https://www.cnblogs.com/k-class/p/13901127.html
Copyright © 2011-2022 走看看