算法的java实现(未优化)

1 篇文章 0 订阅
1 篇文章 0 订阅

直接上代码,基本原理自己应该都清楚

package CN.IT.test;

**/**
 * 可以自己将比较方法和交换方法抽出来,自己进行定义,使用的时候自行引用,
 * 一定程度上实现了解耦合。改比较规则的时候不需要改动源代码。
 * 也可以自己定义一个随机数组,加上时间,数据量越大,越能看出差别。
 */**
import java.util.Arrays;

public class test {
    public static void main(String[] args) {
    
        Integer [] arr = {4,8,5,9,3,2,4,6,1,3,8,11,16};
        test t = new test();


//        t.bubble(arr);
//        t.select(arr);
//        t.insertion(arr);
//        t.shell(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 冒泡
     * @param arr
     */
    public void bubble(Integer[] arr){

        for (int i = arr.length-1; i >0; i--) {
            for (int j = 0; j < i; j++) {
                if (arr[j]>arr[j+1]){
                    int temp;
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
    }

    /**
     * 选择
     * @param arr
     */
    public void select(Integer [] arr){
        for (int i = 0; i < arr.length-1; i++) {
            int minindex=i;
            for (int j = i+1; j <arr.length ; j++) {
                if (arr[i]>arr[j]){
                    int temp;
                    temp=arr[j];
                    arr[j]= arr[i];
                    arr[i]=temp;
                }
            }
        }

    }

    /**
     * 插入
     * @param arr
     */
    public void insertion(Integer [] arr){
        for (int i = 1; i <arr.length ; i++) {
            for (int j = i; j >0 ; j--) {
                if (arr[j]<arr[j-1]){
                    int temp;
                    temp=arr[j];
                    arr[j]= arr[j-1];
                    arr[j-1]=temp;
                }else {
                    break;
                }
            }
        }
    }

    /**
     * 希尔
     * @param arr
     */
    public void shell(Integer [] arr){
        int h =1;
        while (h<arr.length/2){
            h=2*h+1;
        }
        while (h>=1){
        //1.找到待插入元素。i就是待插入元素。
            for (int i = h; i <arr.length ; i++) {
             //2.把待插入元素插入到有序数列中,有序数列就是待插入元素之前的那些数列
                for (int j = i; j >= h ; j-=h) {
                    if (arr[j]<arr[j-h]){
                        int temp;
                        temp=arr[j];
                        arr[j]= arr[j-h];
                        arr[j-h]=temp;
                    }else {
                        break;
                    }
                }
            }
            h=h/2;
        }
    }
}

二路归并

package CN.IT.algorithm.sort;

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

 2.将相邻的两个子组进行合并成一个有序的大组;
 3.不断的重复步骤2,直到终只有一个组为止。
 */
public class Merge {

    private static Comparable[] assist;//归并所需要的辅助数组


    /**
     * 对数组a中的元素进行排序
     */
    public static void sort(Comparable [] a ){
        //1.初始化辅助数组 assit
        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的元素进行排序
      */
   public static void sort(Comparable [] a, int lo, int hi){
       //安全性校验
       if (hi<=lo){
           return;
       }
       //对lo到hi之间的数据进行分两个组

       int mid =lo+(hi-lo)/2;
       //分别对每一组进行排序
       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];
        }
    }
    /**
     * 比较V元素是否小于W元素
     */
    private static boolean less(Comparable v,Comparable w){
        return v.compareTo(w)<0;
    }
}

测试类

package CN.IT.algorithm.test;

import CN.IT.algorithm.sort.Merge;

import java.util.Arrays;
import java.util.Random;

public class MergeTest {
    public static void main(String[] args) {
        //获取开始时间
        long startTime=System.currentTimeMillis();

        /**
         * bound: 限制的是取值范围
         */
        Integer [] arr = new Integer[1000];
        Random r  = new Random();
        for (Integer i = 0; i < 1000; i++) {
            arr[i] = r.nextInt(1000);
        }
        Merge.sort(arr);
        System.out.println(Arrays.toString(arr));

        //获取结束时间
        long endTime =System.currentTimeMillis();
        System.out.println("运行总时间:"+(endTime-startTime)+"ms");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值