常用排序算法----Java实现

依赖包:
junit-4.11-extended:1.0.4
commons-lang3:3.4

源码:

package com.alogrithms.sort;

/**
 * Created by 410s on 2016/6/13.
 */
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.RandomUtils;
import org.junit.Test;

import java.lang.reflect.Array;

import static org.apache.commons.lang3.ArrayUtils.EMPTY_INT_ARRAY;

/**
 *
 */

public class Sort {
    public static int arraySize=1000000;
    public static int[] nums=new int[arraySize];
    static{
        for(int i=0;i<arraySize;i++){
            nums[i]=RandomUtils.nextInt(1,arraySize);
        }
    }
 //   public static int[] nums={2,8,7,1,3,5,6,4};


    /**
     * 插入排序 方法1 将后续值插入已排好序的数组中的对应位置
     * 数据量       耗时
     * 10W          4327
     * 100W         NAN
     */

    @Test
    public void InsertSort(){
        //读取后续值,插入前边已排好序的队列中
        int len=nums.length;
        for(int i=0;i<len;i++)
            for(int j=0;j<i;j++)
            {
                if(nums[i]>nums[j])
                    //如果大于,则继续下一次循环
                    continue;
                else{
                    //当前值正好大于当前值,nums[i]需要插入到num[j]之前
                    int tmp=nums[i];
                    for(int k=i;k>j;k--){
                        nums[k]=nums[k-1];
                    }
                    nums[j]=tmp;
                    break;
                }
            }
        System.out.println(ArrayUtils.toString(nums));
    }

    /**
     * 选择排序  寻找后续数组中的最少值,将其与数组的每一个元素替换位置
     * 数据量       耗时
     * 10W          8624
     * 100W         NAN
     */
    @Test
    public  void SelectSort(){
        //查找后续值中最小的值,将其插入已排好序的队列中
        int len=nums.length;
        int min=Integer.MAX_VALUE;
        int min_index=0;
        for(int i=0;i<len;i++){
            //找到后续值中的最小值
            int j=i;
            for(;j<len;j++){
                if(nums[j]<min)
                {
                    min=nums[j];
                    min_index=j;
                }
            }
            //找到最小值后nums[min_index]与nums[i]替换位置
            int tmp=nums[i];
            nums[i]=nums[min_index];
            nums[min_index]=tmp;
            //初始化min再次寻找后续的最小值
            min=Integer.MAX_VALUE;
        }
        System.out.println(ArrayUtils.toString(nums));
    }

    /**
     *
     * 分治法排序
     * D divide 分隔
     * c Conquer 解决
     * c 合并
     * 数据量       耗时(ms)
     * 10W          209
     * 100W         750
     * 300W         2347
     * 1000W        NAN
     */
    @Test
    public void DccSort(){
        DccSort(0,nums.length-1);
        System.out.println(ArrayUtils.toString(nums));
    }
    public void DccSort(int start,int end){
        if(start==end)
            return;
        int mid=(start+end)/2;
        DccSort(start,mid);
        DccSort(mid+1,end);
        int[] left=subarray(nums,start,mid);
        int[] right=subarray(nums,mid+1,end);

        int i=0;
        int j=0;
        for(int k=start;k<=end;k++) {
            if (j>=right.length||i<left.length&&left[i] <= right[j])
            {
                nums[k]=left[i];
                i=i+1;
            }else if(i>=left.length||j<right.length){
                nums[k]=right[j];
                j=j+1;
            }
        }
    }
    public  int[] subarray(int[] array, int startIndexInclusive, int endIndexExclusive) {
        if(array == null) {
            return null;
        } else {
            if(startIndexInclusive < 0) {
                startIndexInclusive = 0;
            }

            if(endIndexExclusive > array.length) {
                endIndexExclusive = array.length;
            }

            int newSize = endIndexExclusive - startIndexInclusive;

            if(newSize < 0) {
                return EMPTY_INT_ARRAY;
            } else {
                int[] subarray = new int[newSize+1];
                System.arraycopy(array, startIndexInclusive, subarray, 0, newSize+1);
                return subarray;
            }
        }
    }

    /**
     * 冒泡排序
     * 数据量       耗时(ms)
     * 10W          15595
     * 100W         NAN
     * 1000W        NAN
     */
    @Test
    public void BubbleSort(){
        for(int i=0;i<nums.length;i++)
            for(int j=nums.length-1;j>i;j--){
                if(nums[j]<nums[i])
                {
                    int tmp=nums[i];
                    nums[i]=nums[j];
                    nums[j]=tmp;
                }
            }
        System.out.println(ArrayUtils.toString(nums));
    }

    /**
     * 堆排序
     * 数据量       耗时(ms)
     * 10W          162
     * 100W         884
     * 300W         2866
     * 1000W
     */
    @Test
    public void HeapSort(){
        for(int i=nums.length/2-1;i>=0;i--)
            this.max_heapify(i,nums.length);
        for(int i=nums.length-1;i>=1;i--){
            int tmp=nums[0];
            nums[0]=nums[i];
            nums[i]=tmp;
            max_heapify(0,nums.length-(nums.length-i));
        }
        System.out.println(ArrayUtils.toString(nums));
    }

    /**
     *
     * @param i
     * @param size 对数组中 前size个元素构建堆
     */
    public void max_heapify(int i,int size){
        int l=this.leftIndex(i);
        int r=this.rightIndex(i);
        int largest=0;
        if(l<size&&nums[l]>nums[i])
        {
            largest=l;
        }else
        {
            largest=i;
        }
        if(r<size&&nums[r]>nums[largest]){
            largest=r;
        }
        if(largest!=i){
            int tmp=nums[i];
            nums[i]=nums[largest];
            nums[largest]=tmp;
            max_heapify(largest,size);
        }
    }

    public static final  int parentIndex(int i)
    {
        return (i-1)/2;
    }
    public static final int leftIndex(int i)
    {
        return 2*i+1;
    }
    public static final int rightIndex(int i)
    {
        return 2*i+2;
    }

    /**
     * 快速排序
     */
    @Test
    public void QuickSort(){
        QuitSort_Random(0,nums.length-1);
        System.out.println(ArrayUtils.toString(nums));
    };
    public void QuickSort_Classical(int p,int r){
        if(p<r)
        {
            int q=QuickSort(p,r);
            QuickSort_Classical(p,q-1);
            QuickSort_Classical(q+1,r);
        }
    }
    public void QuitSort_Random(int p,int r){
        if(p<r){
            int i=RandomUtils.nextInt(p,r);
            int tmp=nums[i];
            nums[i]=nums[r];
            nums[r]=tmp;
            int mid=QuickSort(p,r);
            QuitSort_Random(p,mid-1);
            QuitSort_Random(mid+1,r);
        }

    }

    public int QuickSort(int p,int r){
        int x=nums[r];
        int i=p-1;
        for(int j=p;j<r;j++){
            if(nums[j]<=x){
                i++;
                int tmp=nums[i];
                nums[i]=nums[j];
                nums[j]=tmp;
            }
        }
        int tmp=nums[i+1];
        nums[i+1]=nums[r];
        nums[r]=tmp;
        return i+1;
    }

    /**
     * 计数排序
     * 10W  155
     * 100w 603
     */
    @Test
    public void CountingSort(){

        int max=nums[0];
        for(int i=0;i<nums.length;i++){
            if(nums[i]>max)
                max=nums[i];
        }
        int[] c=new int[max+1];
        int[] out=new int[nums.length];
        for(int i=0;i<nums.length;i++){
            c[nums[i]]++;
        }
        for(int i=1;i<nums.length;i++){
            c[i]=c[i]+c[i-1];
        }

        for(int i=nums.length-1;i>=0;i--){
            out[c[nums[i]]-1]=nums[i];
            c[nums[i]]--;
        }
        System.out.println(ArrayUtils.toString(out));
    }
}


http://www.niftyadmin.cn/n/1737013.html

相关文章

vsftpd 安装配置(基于Ubuntu)

vsftpd 安装配置&#xff08;基于Ubuntu) 1、更新源 sudo apt-get update 2、安装vsftp sudo apt-get install vsftpd 3、添加ftp帐号和目录 3.1、先检查一下nologin的位置 sudo locate nologin 我本地执行上述命令后可以看到nologin位置在/usr/sbin/nologin 3.2、使…

SSH安装(基于Ubuntu)

通常为了便于管理linux服务器&#xff0c;我们会给服务器里安装ssh以便远程登录。以下介绍ssh安装过程 1、更新源(如果最近更新过可以跳过&#xff09; sudo apt-get update 2、安装 sudo apt-get install ssh 3、重新启动ssh sudo service ssh restart 如果没有报错就说…

Linux JDK1.8 安装(基于Ubuntu)

关于Linux jdk(下载、安装&#xff09;的网络文章有很多&#xff0c;此处不再赘述。 此处主要是记录一些环境变量的配置 1、编辑/etc/profile sudo vi /etc/profile 2、向其中添加以下内容 export JAVA_HOME/home/local/jdk1.8.0_91 export PATH$PATH:$JAVA_HOME/bin ex…

Hbase 快速启动指南

本文内容参考《HBASE权威指南》中关于“2.1 、快速启动指南” 1、正确安装JDK&#xff0c;并设置JAVA_HOME等环境变量 2、安装HBASE 解压hbase压缩包 tar -xvzf hbase-1.2.3-bin.tar.gz 将解压后的目录移动到你希望的hbase安装目录 我这里将其移动到/home/local/目录下 …

linux操作知识归集

linux操作知识归集(ubuntu) 修改主机名 vi /etc/hostname 该文件中第一行就是主机名 设置固定IP&#xff0c;以及DNS 在Ubuntu 12.04 server 中需要 sudo vi etc/network/interfaces 下图为本机文件内容 关于cp命令的一些测试 cp是文件复制命令&#xff0c;是linux使…

批量配置计算机集群SSH免登录

本文所有代码可在https://github.com/alphg/zookeeper-hadoop-hbase-setup-tools查看 今天准备在自已电脑上使用5台虚拟机搭建一个zookeeperhadoophbase的一个完全分布模式的实验环境。每台机器都安装ubuntu server 12.04版本的linux系统&#xff0c;并正确安装ssh。 给5台机…

linux zookeeper 集群搭建

网上有很多zookeeper安装的教程&#xff0c;简洁明了的如 http://blog.csdn.net/gobitan/article/details/8659175 我这里安装过程与上述文章没有大的区别只是为了管理方便使用以下代码复制zookeeper的相关文件 &#xff08;源码见&#xff1a;https://github.com/alphg/zoo…

AVRO 数据序列化系统学习笔记

本篇内容基于《hadoop权威指南&#xff08;第三版&#xff09;》内容。我在实现书中源代码的时候会出现一些错误&#xff08;我在windows平台下测试&#xff09;&#xff0c;这里做了一些改进&#xff0c;同时我也想在书中内容的基础上了解更多AVRO的信息&#xff0c;所以写这个…