常用排序算法----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));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iblks

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值