`

各种排序算法java实现

阅读更多
 

插入排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;
/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class InsertSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int temp;
        for(int i=1;i<data.length;i++){
            for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
                SortUtil.swap(data,j,j-1);
            }
        }       
    }

}
冒泡排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class BubbleSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int temp;
        for(int i=0;i<data.length;i++){
            for(int j=data.length-1;j>i;j--){
                if(data[j]<data[j-1]){
                    SortUtil.swap(data,j,j-1);
                }
            }
        }
    }

}

选择排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class SelectionSort implements SortUtil.Sort {

    /*
     * (non-Javadoc)
     *
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int temp;
        for (int i = 0; i < data.length; i++) {
            int lowIndex = i;
            for (int j = data.length - 1; j > i; j--) {
                if (data[j] < data[lowIndex]) {
                    lowIndex = j;
                }
            }
            SortUtil.swap(data,i,lowIndex);
        }
    }

}

Shell排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class ShellSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        for(int i=data.length/2;i>2;i/=2){
            for(int j=0;j<i;j++){
                insertSort(data,j,i);
            }
        }
        insertSort(data,0,1);
    }

    /**
     * @param data
     * @param j
     * @param i
     */
    private void insertSort(int[] data, int start, int inc) {
        int temp;
        for(int i=start+inc;i<data.length;i+=inc){
            for(int j=i;(j>=inc)&&(data[j]<data[j-inc]);j-=inc){
                SortUtil.swap(data,j,j-inc);
            }
        }
    }

}

快速排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class QuickSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        quickSort(data,0,data.length-1);       
    }
    private void quickSort(int[] data,int i,int j){
        int pivotIndex=(i+j)/2;
        //swap
        SortUtil.swap(data,pivotIndex,j);
       
        int k=partition(data,i-1,j,data[j]);
        SortUtil.swap(data,k,j);
        if((k-i)>1) quickSort(data,i,k-1);
        if((j-k)>1) quickSort(data,k+1,j);
       
    }
    /**
     * @param data
     * @param i
     * @param j
     * @return
     */
    private int partition(int[] data, int l, int r,int pivot) {
        do{
           while(data[++l]<pivot);
           while((r!=0)&&data[--r]>pivot);
           SortUtil.swap(data,l,r);
        }
        while(l<r);
        SortUtil.swap(data,l,r);       
        return l;
    }

}
改进后的快速排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class ImprovedQuickSort implements SortUtil.Sort {

    private static int MAX_STACK_SIZE=4096;
    private static int THRESHOLD=10;
    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int[] stack=new int[MAX_STACK_SIZE];
       
        int top=-1;
        int pivot;
        int pivotIndex,l,r;
       
        stack[++top]=0;
        stack[++top]=data.length-1;
       
        while(top>0){
            int j=stack[top--];
            int i=stack[top--];
           
            pivotIndex=(i+j)/2;
            pivot=data[pivotIndex];
           
            SortUtil.swap(data,pivotIndex,j);
           
            //partition
            l=i-1;
            r=j;
            do{
                while(data[++l]<pivot);
                while((r!=0)&&(data[--r]>pivot));
                SortUtil.swap(data,l,r);
            }
            while(l<r);
            SortUtil.swap(data,l,r);
            SortUtil.swap(data,l,j);
           
            if((l-i)>THRESHOLD){
                stack[++top]=i;
                stack[++top]=l-1;
            }
            if((j-l)>THRESHOLD){
                stack[++top]=l+1;
                stack[++top]=j;
            }
           
        }
        //new InsertSort().sort(data);
        insertSort(data);
    }
    /**
     * @param data
     */
    private void insertSort(int[] data) {
        int temp;
        for(int i=1;i<data.length;i++){
            for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
                SortUtil.swap(data,j,j-1);
            }
        }      
    }

}

归并排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class MergeSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int[] temp=new int[data.length];
        mergeSort(data,temp,0,data.length-1);
    }
   
    private void mergeSort(int[] data,int[] temp,int l,int r){
        int mid=(l+r)/2;
        if(l==r) return ;
        mergeSort(data,temp,l,mid);
        mergeSort(data,temp,mid+1,r);
        for(int i=l;i<=r;i++){
            temp[i]=data[i];
        }
        int i1=l;
        int i2=mid+1;
        for(int cur=l;cur<=r;cur++){
            if(i1==mid+1)
                data[cur]=temp[i2++];
            else if(i2>r)
                data[cur]=temp[i1++];
            else if(temp[i1]<temp[i2])
                data[cur]=temp[i1++];
            else
                data[cur]=temp[i2++];           
        }
    }

}

改进后的归并排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class ImprovedMergeSort implements SortUtil.Sort {

    private static final int THRESHOLD = 10;

    /*
     * (non-Javadoc)
     *
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int[] temp=new int[data.length];
        mergeSort(data,temp,0,data.length-1);
    }

    private void mergeSort(int[] data, int[] temp, int l, int r) {
        int i, j, k;
        int mid = (l + r) / 2;
        if (l == r)
            return;
        if ((mid - l) >= THRESHOLD)
            mergeSort(data, temp, l, mid);
        else
            insertSort(data, l, mid - l + 1);
        if ((r - mid) > THRESHOLD)
            mergeSort(data, temp, mid + 1, r);
        else
            insertSort(data, mid + 1, r - mid);

        for (i = l; i <= mid; i++) {
            temp[i] = data[i];
        }
        for (j = 1; j <= r - mid; j++) {
            temp[r - j + 1] = data[j + mid];
        }
        int a = temp[l];
        int b = temp[r];
        for (i = l, j = r, k = l; k <= r; k++) {
            if (a < b) {
                data[k] = temp[i++];
                a = temp[i];
            } else {
                data[k] = temp[j--];
                b = temp[j];
            }
        }
    }

    /**
     * @param data
     * @param l
     * @param i
     */
    private void insertSort(int[] data, int start, int len) {
        for(int i=start+1;i<start+len;i++){
            for(int j=i;(j>start) && data[j]<data[j-1];j--){
                SortUtil.swap(data,j,j-1);
            }
        }
    }

}
堆排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class HeapSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        MaxHeap h=new MaxHeap();
        h.init(data);
        for(int i=0;i<data.length;i++)
            h.remove();
        System.arraycopy(h.queue,1,data,0,data.length);
    }


     private static class MaxHeap{
        
       
        void init(int[] data){
            this.queue=new int[data.length+1];
            for(int i=0;i<data.length;i++){
                queue[++size]=data[i];
                fixUp(size);
            }
        }
        
        private int size=0;

        private int[] queue;
               
        public int get() {
            return queue[1];
        }

        public void remove() {
            SortUtil.swap(queue,1,size--);
            fixDown(1);
        }
        //fixdown
        private void fixDown(int k) {
            int j;
            while ((j = k << 1) <= size) {
                if (j < size && queue[j]<queue[j+1])
                    j++;
                if (queue[k]>queue[j]) //不用交换
                    break;
                SortUtil.swap(queue,j,k);
                k = j;
            }
        }
        private void fixUp(int k) {
            while (k > 1) {
                int j = k >> 1;
                if (queue[j]>queue[k])
                    break;
                SortUtil.swap(queue,j,k);
                k = j;
            }
        }

    }

}

 

SortUtil:

package org.rut.util.algorithm;

import org.rut.util.algorithm.support.BubbleSort;
import org.rut.util.algorithm.support.HeapSort;
import org.rut.util.algorithm.support.ImprovedMergeSort;
import org.rut.util.algorithm.support.ImprovedQuickSort;
import org.rut.util.algorithm.support.InsertSort;
import org.rut.util.algorithm.support.MergeSort;
import org.rut.util.algorithm.support.QuickSort;
import org.rut.util.algorithm.support.SelectionSort;
import org.rut.util.algorithm.support.ShellSort;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class SortUtil {
    public final static int INSERT = 1;

    public final static int BUBBLE = 2;

    public final static int SELECTION = 3;

    public final static int SHELL = 4;

    public final static int QUICK = 5;

    public final static int IMPROVED_QUICK = 6;

    public final static int MERGE = 7;

    public final static int IMPROVED_MERGE = 8;

    public final static int HEAP = 9;

    public static void sort(int[] data) {
        sort(data, IMPROVED_QUICK);
    }
    private static String[] name={
            "insert","bubble","selection","shell","quick","improved_quick","merge","improved_merge","heap"
    };
   
    private static Sort[] impl=new Sort[]{
            new InsertSort(),
            new BubbleSort(),
            new SelectionSort(),
            new ShellSort(),
            new QuickSort(),
            new ImprovedQuickSort(),
            new MergeSort(),
            new ImprovedMergeSort(),
            new HeapSort()
    };

    public static String toString(int algorithm){
        return name[algorithm-1];
    }
   
    public static void sort(int[] data, int algorithm) {
        impl[algorithm-1].sort(data);
    }

    public static interface Sort {
        public void sort(int[] data);
    }

    public static void swap(int[] data, int i, int j) {
        int temp = data[i];
        data[i] = data[j];
        data[j] = temp;
    }
}

分享到:
评论

相关推荐

    _各种排序算法java实现.doc

    _各种排序算法java实现.doc

    各种排序算法 java实现

    总结了几种典型的nlogn的排序算法,实现过程在代码中详细给出了,请大家自己下载就能直接运行,给各位参考吧。

    IT面试笔试-各种排序算法Java实现

    IT常见的面试题目,各种排序算法的Java代码实现,内部有代码和详细的注释信息。

    计算机专业Java专业课程实验+CRM客户关系管理系统设计学生课程实验.zip

    学生课程实验:大二计算机专业JAVA专业课的课程实验,设计一个CRM的客户关系管理系统,含项目源码、数据库、以及汇报PPT。 内容目录: ├── readme.txt ├── 基于Java的CRM客户关系管理系统的设计和实现数据库 │ └── crm.sql ├── 基于Java的CRM客户关系管理系统的设计和实现项目源代码 │ └── MyCrm.zip ├── 基于Java的CRM客户关系管理系统的设计和实现项目运行截图 │ ├── 主界面.PNG │ ├── 产品信息管理.PNG │ ├── 客户信息添加.PNG │ ├── 登录.PNG │ └── 角色管理.PNG ├── 视频 │ ├── 1CRM客户关系管理系统_项目的配置以及启动.url │ ├── 2CRM客户关系管理系统_工作桌面_信息中心_邮箱功能_客户管理_订单管理.url │ └── 3CRM客户关系管理系统_财务管理_产品管理_部门管理_岗位管理_数据回收站_权限管.url └── 论文 ├── 基于Java的现代数字化CRM客户关系管理系统答辩ppt.pptx

    node-v12.17.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    常见移动变现术语(mobile monetization).docx

    常见移动变现术语(mobile monetization).docx

    废物转运站:决策指南 垃圾转运站:决策指南

    废物转运站:决策指南

    冰蓄冷的一些资料.zip

    冰蓄冷的一些资料:包括系统的原理图,设计计算等

    8. Django 表单与模型

    配套资源

    【蓝桥杯嵌入式】第七届省赛 - 模拟液位检测告警系统

    开源 【蓝桥杯嵌入式】第七届省赛 - 模拟液位检测告警系统

    基于matlab-gmm-dtw的说话人识别源码.zip

    本代码是基于DTW(动态时间规则)算法以及GMM(混合高斯模型)进行的说话人识别的程序。 现在大部分的说话人识别模型是基于MFCC的混合高斯模型设计的,但基于此的识别方式会受说话人之间相互模仿的影响,所以增加了一种特征参数,基音周期。 基因周期包含了语音频率结构信息,不易模仿。同时若直接对高斯混合模型进行解混会使识别速度很慢,所以先用DTW再用GMM可以极大地缩减识别时间。 注意:此代码仅为说话人识别代码,如需进行语音文件录制请自行添加面。 为了使使用更加条理清晰,建议后续添加说话人按照freespeech中已经建成的文件夹为模板并分类存放说话人语音文件,将对应说话人的语音文件保存在对应的文件夹中。 此建议仅为使使用者更加条理清晰,语音文件也可直接存放在freespeech文件夹中。 确认电脑安装配置了voicebox后,直接运行test4.m文件,会出现gui界面,接下来的操作,根据界面提示进行即可。 重新训练数据库,可在上述运行界面中删除数据库后重新训练即可,也可只知删除部分人的数据。 程序使用许先建立数据库。录制的语音时间太长会使程序生成数据库和数据比对的时间加长,请耐

    Honeywell BR-310 条形码扫描器手册

    Honeywell BR-310 条形码扫描器手册

    QT6实现的附带文件传输协议的串口终端

    QT6实现的附带文件传输协议的串口终端 QT6实现的附带文件传输协议的串口终端

    unity开发入门教程.zip

    Unity是一个流行的跨平台游戏开发引擎,它允许开发者使用C#等语言创建2D和3D游戏。以下是一个Unity开发的基本入门教程: 1. 安装Unity 首先,你需要从Unity的官方网站下载并安装Unity Hub和Unity编辑器。Unity Hub是一个用于管理Unity版本和项目的工具。 2. 创建新项目 打开Unity Hub,点击“New”来创建一个新项目。选择你需要的Unity版本、模板(例如2D或3D)和其他设置。 3. 熟悉Unity界面 Unity的界面主要由以下几个部分组成: Hierarchy:显示场景中的所有游戏对象。 Project:显示项目的所有资源,如场景、模型、材质、脚本等。 Inspector:显示当前选中游戏对象的详细信息和属性。 Scene:显示当前场景的3D视图,你可以在这里编辑游戏对象。 Game:显示游戏运行时的视图。

    基于MobileFaceNet的静默活体检测系统的设计与实现python源码+项目说明+模型.zip

    基于MobileFaceNet的静默活体检测系统的设计与实现python源码+项目说明+模型.zip 1、代码 2、实验环境 Windows 10(64位) CPU:AMD Ryzen 7 5800H RAM:16G GPU:NVIDIA RTX3060 开发工具:IntelliJ IDEA以及PyCharm 相关配置及版本: Chrome 90.0.4430.212 SpringBoot 2.2.6 Java JDK8 MyBatis 2.1.1 Mysql 8.0.25 Python 3.8 pytorch 1.7.1 torchvision 0.8.2 numpy 1.18.5 tensorboard 2.4.1 pandas 1.2.3 cuda 11.0.2 cudnn 11.2 torch 1.8.1 torchvision 0.9.1 3、模型训练命令 python train.py 4、模型测试命令 python test.py 5、运行检测模块命令 python detect.py --source 0

    金融产品营销方案设计33.docx

    金融产品营销方案设计33.docx

    识别说话人的性别和估计说话人的年龄 Matlab+MatlabGUI+SVM源码.zip

    识别说话人的性别和估计说话人的年龄 Matlab+MatlabGUI+SVM源码.zip识别说话人的性别和估计说话人的年龄 Matlab+MatlabGUI+SVM源码.zip识别说话人的性别和估计说话人的年龄 Matlab+MatlabGUI+SVM源码.zip识别说话人的性别和估计说话人的年龄 Matlab+MatlabGUI+SVM源码.zip识别说话人的性别和估计说话人的年龄 Matlab+MatlabGUI+SVM源码.zip识别说话人的性别和估计说话人的年龄 Matlab+MatlabGUI+SVM源码.zip识别说话人的性别和估计说话人的年龄 Matlab+MatlabGUI+SVM源码.zip

    Mysql数据库实战教程&案例&相关项目

    MySQL数据库作为一个广泛使用的开源关系型数据库管理系统,它在Web开发、数据管理和企业级应用中扮演着重要角色。以下是对MySQL数据库实战教程、案例及相关项目的描述: MySQL数据库实战教程: 教程目的:教程旨在教授学习者如何高效地使用MySQL进行数据存储、查询、更新和管理。通过实战案例,学习者将掌握数据库设计、SQL语言的高级应用、性能优化等关键技能。 核心内容: 数据库设计:学习关系型数据库的设计原则,包括实体关系模型、规范化理论等。 SQL语言:深入理解SQL语句的编写,包括数据的增删改查(CRUD)操作。 数据类型与索引:掌握MySQL支持的数据类型以及如何设计索引以提高查询效率。 存储引擎:了解不同的存储引擎如InnoDB、MyISAM的特性及其适用场景。 性能优化:学习如何分析查询性能并进行优化,包括查询重写和数据库调优。 实战案例: 案例一:电商数据库管理:设计一个电商网站的数据库,实现商品展示、用户登录、购物车管理等功能。 案例二:金融交易系统:构建一个金融交易数据库,模拟交易记录的存储和查询,包括实时数据分析。 案例三:社交网络平台:开发一个社交网络

    b0900febba0972d39e8ab81732d7a34c.mp3

    b0900febba0972d39e8ab81732d7a34c.mp3

Global site tag (gtag.js) - Google Analytics