• 排序算法的java实现


    1.冒泡排序

    排序原理:
    1. 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。

    2. 对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大

    值。

    public class BubbleTest {
        public static void main(String[] args) { 
    Integer[] arr = {3,5,4,2,7,9,6,0};    
    for(int i =arr.length-1;i>0;i--){//初始化参与排序个数,步长是i--        
        for (int j=0;j<i;j++)            
            if (compare(arr[j],arr[j+1])){                
                exch(arr,j,j+1);            
            }    
    }    System.out.println(Arrays.toString(arr));}
    private static Integer[] exch(Integer[] arr,Integer a1, Integer a2) {    
        Integer temp;    
        temp = arr[a1];    
        arr[a1]=arr[a2];    
        arr[a2]=temp;    
        return arr;}
    private static boolean compare(Comparable c1,Comparable c2) {    
        return c1.compareTo(c2)<0;
    }
    }
    
    compareTo接口

    integer中的类,实现了compare静态方法,返回int类型,

    若x<y 返回-1,x=y返回0 ,x>y返回1

    public int compareTo(Integer anotherInteger) {
            return compare(this.value, anotherInteger.value);
        }
    
    public static int compare(int x, int y) {    
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }
    

    2.选择排序

    排序原理:

    1.每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处 的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引

    2.交换第一个索引处和最小值所在的索引处的值

    public static void sort(Comparable[] a){    
        for(int i=0;i<=a.length-2;i++){//定义一个变量,记录最小元素所在的索引,默认为参与选择排序的第一个元素所在的位置        
            int minIndex = i;        
            for(int j=i+1;j<a.length;j++){     //需要比较最小索引minIndex处的值和j索引处的值;     
                if (greater(a[minIndex],a[j]))
                {                
                    minIndex=j;       //交换最小元素所在索引minIndex处的值和索引i处的值      
                }        
            }               
            exch(a,i,minIndex);    
        }
    }
        /*
            比较v元素是否大于w元素
         */
        private static  boolean greater(Comparable v,Comparable w){
            return v.compareTo(w)>0;
        }
        /*
        数组元素i和j交换位置
         */
        private static void exch(Comparable[] a,int i,int j){
            Comparable temp;
            temp = a[i];
            a[i]=a[j];
            a[j]=temp;
        }
    

    3.插入排序

    排序原理:

    1.把所有的元素分为两组,已经排序的和未排序的;

    2.找到未排序的组中的第一个元素,向已经排序的组中进行插入;

    3.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待

    插入元素放到这个位置,其他的元素向后移动一位;

        /*
           对数组a中的元素进行排序
        */
        public static void sort(Comparable[] a){
            for(int i=1;i<a.length;i++){
                for(int j=i;j>0;j--){
                    //比较索引j处的值和索引j-1处的值,如果索引j-1处的值比索引j处的值大,则交换数据,如果不大,那么就找到合适的位置了,退出循环即可;
                    if (greater(a[j-1],a[j])){
                        exch(a,j-1,j);
                    }else{
                        break;
                    }
                }
    
            }
        }
    

    4.归并排序

    排序原理:

    1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是 1为止。

    2.将相邻的两个子组进行合并成一个有序的大组;

    3.不断的重复步骤2,直到最终只有一个组为止。

    public class Merge {
        //归并所需要的辅助数组
        private static Comparable[] assist;
    
        /*
           比较v元素是否小于w元素
        */
        private static boolean less(Comparable v, Comparable w) {
            return v.compareTo(w)<0;
        }
    
        /*
        数组元素i和j交换位置
         */
        private static void exch(Comparable[] a, int i, int j) {
            Comparable t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    
    
        /*
               对数组a中的元素进行排序
            */
        public static void sort(Comparable[] a) {
            //1.初始化辅助数组assist;
            assist = new Comparable[a.length];
            //2.定义一个lo变量,和hi变量,分别记录数组中最小的索引和最大的索引;
            int lo=0;
            int hi=a.length-1;
            //3.调用sort重载方法完成数组a中,从索引lo到索引hi的元素的排序
            sort(a,lo,hi);
        }
    
        /*
        对数组a中从lo到hi的元素进行排序
         */
        private static void sort(Comparable[] a, int lo, int hi) {
            //做安全性校验;
            if (hi<=lo){
                return;
            }
    
            //对lo到hi之间的数据进行分为两个组
            int mid = lo+(hi-lo)/2;//   5,9  mid=7
    
            //分别对每一组数据进行排序
            sort(a,lo,mid);
            sort(a,mid+1,hi);
    
            //再把两个组中的数据进行归并
            merge(a,lo,mid,hi);
        }
    
        /*
        对数组中,从lo到mid为一组,从mid+1到hi为一组,对这两组数据进行归并
         */
        private static void merge(Comparable[] a, int lo, int mid, int hi) {
            //定义三个指针
            int i=lo;
            int p1=lo;
            int p2=mid+1;
    
            //遍历,移动p1指针和p2指针,比较对应索引处的值,找出小的那个,放到辅助数组的对应索引处
            while(p1<=mid && p2<=hi){
                //比较对应索引处的值
                if (less(a[p1],a[p2])){
                    assist[i++] = a[p1++];
                }else{
                    assist[i++]=a[p2++];
                }
            }
    
            //遍历,如果p1的指针没有走完,那么顺序移动p1指针,把对应的元素放到辅助数组的对应索引处
            while(p1<=mid){
                assist[i++]=a[p1++];
            }
            //遍历,如果p2的指针没有走完,那么顺序移动p2指针,把对应的元素放到辅助数组的对应索引处
            while(p2<=hi){
                assist[i++]=a[p2++];
            }
            //把辅助数组中的元素拷贝到原数组中
            for(int index=lo;index<=hi;index++){
                a[index]=assist[index];
            }
        }
    }
    
    
    
    温故而知新
  • 相关阅读:
    GET和POST区别
    es索引介绍
    前端 用法记录
    axios 使用
    react技巧 学习
    vuex 学习笔记
    fetch 学习笔记
    react-router 4.0 学习笔记
    react 学习笔记2
    react 学习笔记
  • 原文地址:https://www.cnblogs.com/littleTiger-bukeai/p/14143094.html
Copyright © 2020-2023  润新知