排序算法总结(Java泛型实现)

详解Java中使用泛型实现快速排序算法的方法 主要介绍了Java中使用泛型实现快速排序算法的方法,快速排序的平均时间复杂度为(nlog n),文中的方法立足于基础而并没有考虑优化处理,需要的朋友可以参考下 立即下载

游戏规则

我们关注的主要对象是重新排列数组元素的算法,其中每个元素都有一个主键,排序算法的目标就是将所有元素的主键按照某种方式排列。在Java中,元素通常都是对象,对主键的抽象描述是通过一种内置的机制(Comparable接口)来完成的。
大多数情况下,我们的排序代码只会通过两个方法操作数据:less()方法对元素进行比较,exch方法将元素交换位置。将数据操作限制在这两个方法中使得代码的可读性和可移植性更好,更容易验证代码的正确性、分析性能以及排序算法之间的比较。
我们的排序算法模板适用于任何实现了Comparable接口的数据类型。例如,Java中封装数字的类型Integer和Double,以及String和其他许多高级数据类型(如File和URL)都实现了Comparable,因此可以直接使用这些类型的数组作为参数调用我们的排序方法。
在创建自己的数据类型时,只需要实现Comparable接口就能够保证用例代码可以将其排序。要做到这一点,只需要实现一个compareTo()方法来定义目标类型对象的自然次序即可。

自定义数据类型实现Comparable接口

下面是一个自定义类型HolidayDate,使用日期作为主键进行比较:

public class HolidayDate implements Comparable<HolidayDate>
{
    private final String name;
    private final int day;
    private final int month;
    public HolidayDate(String n, int m, int d) {
        name = n;
        day = d;
        month = m;
    }
    public int day() {
        return day;
    }
    public int month() {
        return month;
    }
    public String name() {
        return name;
    }
    public int compareTo(HolidayDate that) {
        if(this.month > that.month) return 1;
        if(this.month < that.month) return -1;
        if(this.day > that.day) return 1;
        if(this.day < that.day) return -1;
        return 0;
    }
    public String toString() {
        return name + " is in " + month + "/" + day;
    }
}

数据操作的泛型方法less()和exch()

protected static boolean less(Comparable v, Comparable w) {
        return v.compareTo(w) < 0;
    }
protected static void exch(Comparable[] a, int i, int j) {
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

打印数组的泛型方法show

protected static void show(Comparable[] a) {
        // 打印数组
        for(int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }

选择排序

算法原理:
首先找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。
算法特点:
运行时间和输入无关,取决于比较的次数;
数据移动是最少的,使用了N次交换。
算法实现:

public static void sort(Comparable[] a) {
        // 将a[]按升序排列
        int N = a.length;
        for(int i = 0; i < N; i++) {
            // 将a[i]和a[i+1...N]中最小的元素交换
            int min = i;
            for(int j = i+1 ; j < N; j++) {
                if(less(a[j], a[min])) {
                    min = j;
                }
            }
            exch(a, i, min);
        }
    }

插入排序

算法原理:
像排序一手扑克牌,一张一张的进行整理,将每一张牌插入到其他已经有序的牌中的适当位置。实现时,为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。
算法特点:
运行时间取决于输入中元素的初始顺序。如对一个其中的元素已经(接近)有序的数组进行排序将会比对随机顺序的数组或逆序数组进行排序要快得多。
算法实现:

public static void sort(Comparable[] a) {
        // 将a[]按升序排列
        int N = a.length;
        for(int i = 1; i < N; i++) {
            // 将 a[i]插入到a[i-1]、a[i-2]、...之中
            for(int j = i; j > 0 && less(a[j], a[j-1]); j--) {
                exch(a, j, j-1);
            }
        }
    }

希尔排序

算法原理:
希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序对局部有序的数组排序。希尔排序的思想是使数组中任意间隔为h的元素都是有序的。在进行排序时,如果h很大,我们就能将元素移动到很远的地方,为实现更小的h有序创造方便。用这种方式,对于任意以1结尾的h序列,我们都能够将数组排序。
算法特点:
权衡了子数组的规模和有序性。排序之初,各个子数组都很短,排序之后的子数组都是部分有序的。这两种情况都很适合插入排序。
目前还没有人给出选取最好的增量因子序列的方法。
算法实现:

public static void sort(Comparable[] a) {
        // 将a[]按升序排列
        int N = a.length;
        int h = 1;
        while(h < N/3) {
            h = 3*h + 1;
        }
        while(h >= 1) {
            // 将数组变为h有序
            for(int i = h; i < N; i++) {
                // 将 a[i]插入到a[i-h], a[i-2*h], ...之中
                for(int j = i; j >= h && less(a[j], a[j-h]); j -= h) {
                    exch(a, j, j-h);
                }
            }
            h = h/3;
        }
    }

归并排序

算法原理:
先递归地将数组分成两半分别排序,然后将结果归并起来。
算法特点:
运行时间与NlogN成正比,适用于处理数百万甚至更大规模的数组;
缺点是所需的额外空间与N成正比;
算法实现:

private static Comparable[] aux;
private static void sort(Comparable[] a) {
        aux = new Comparable[a.length]; // 一次性分配空间
        sort(a, 0, a.length-1);
    }
public static void sort(Comparable[] a, int lo, int hi) {
        // 将数组a[lo..hi]自顶向下地归并排序
        if(hi <= lo)
            return;
        int mid = lo + (hi - lo)/2;
        sort(a, lo, mid);   // 将左半边排序
        sort(a, mid+1, hi);     // 将右半边排序
        merge(a, lo, mid, hi);  // 归并结果
    }
private static void merge(Comparable[] a, int lo, int mid, int hi) {
        // 将a[lo..mid]和a[mid+1..hi]原地归并
        int i = lo, j = mid+1;
        // 将a[lo..hi]复制到aux[lo..hi]
        for(int k = lo; k <= hi; k++)
            aux[k] = a[k];
        // 归并回到a[lo..hi]
        for(int k = lo; k <= hi; k++)
            if(i > mid) // 左半边用尽,取右半边的元素
                a[k] = aux[j++];
            else if(j > hi) // 右半边用尽,取左半边的元素
                a[k] = aux[i++];
            else if(less(aux[j], aux[i]))   // 右半边的当前元素小于左半边的当前元素,取右半边的元素
                a[k] = aux[j++];
            else    // 右半边的当前元素大于等于左半边的当前元素,取左半边的元素
                a[k] = aux[i++];
    }
public static void sort(Comparable[] a) {
        // 将数组a自底向上地归并排序
        int N = a.length;
        aux = new Comparable[N];
        for(int sz = 1; sz < N; sz = sz+sz) // sz子数组大小
            for(int lo = 0; lo < N-sz; lo += sz+sz) // lo:子数组索引
                merge(a, lo, lo+sz-1, Math.min(lo+sz+sz-1, N-1));
    }

算法改进:
对小规模子数组使用插入排序;
测试数组是否已经有序,如果a[mid]小于等于a[mid+1],则跳过merge()方法;
不将元素复制到辅助数组,在递归调用的每个层次交换输入数组和辅助数组的角色,节省将数组元素复制到用于归并的辅助数组所用的时间。

快速排序

算法原理:
将一个数组分成两个数组,将两部分独立地排序,当这两个子数组都有序时整个数组也就自然有序了。快速排序和归并排序是互补的,在归并排序中一个数组被等分为两半,在快速排序中切分的位置取决于数组的内容。
快速排序的关键在于切分,这个过程使得数组满足三个条件:

  1. 对于某个j,a[j]已经排定;
  2. a[lo]到a[j-1]中的所有元素都不大于a[j];
  3. a[j+1]到a[hi]中的所有元素都不小于a[j];

算法特点:
原地排序,只需要一个很小的辅助栈;
运行时间和NlgN成正比;
非常脆弱,在实现时需要非常小心才能避免低劣的性能(平方级别)。
算法实现:

public static void sort(Comparable[] a) {
        sort(a, 0, a.length-1);
    }
    private static void sort(Comparable[] a, int lo, int hi) {
        if(hi <= lo)
            return ;
        int j = partition(a, lo, hi);   // 切分
        sort(a, lo, j-1);   // 将左半部分排序
        sort(a, j+1, hi);   // 将右半部分排序
    }
    private static int partition(Comparable[] a, int lo, int hi) {
        // 将数组切分为a[lo..i-1], a[i], a[i+1..hi]
        int i = lo, j = hi+1;   // 左右扫描指针
        Comparable v = a[lo];   // 切分元素
        while(true) {
            // 扫描左右, 检查扫描是否结束并交换元素
            while(less(a[++i], v))
                if(i == hi)
                    break;
            while(less(v, a[--j]))
                if(j == lo)
                    break;
            if(i >= j)
                break;
            exch(a, i, j);  
        }
        exch(a, lo, j); // 将v = a[j]放入正确 的位置
        return j;   // a[lo..j-1] <= a[j] <= a[j+1..hi]达成
    }

堆排序

算法原理:
堆排序可以分为两个阶段。在堆的构造阶段,将原始数组重新组织并安排进一个堆中;然后在下沉排序阶段,从堆中按递减顺序取出所有元素并得到排序结果。
算法特点:
在排序时将需要排序的数组本身作为堆,无需任何额外空间;
运行时间为NlogN;
算法实现:

public static void sort(Comparable[] a) {
        int N = a.length-1; // 数组a存储在a[0..N]上
        for (int k = N/2; k >= 0; k--)  // 最大堆的构造阶段
            sink(a, k, N);
        while(N > 0) {  // 下沉排序阶段
            exch(a, 0, N--);    // 将最大元素从a[0]交换至a[N]
            sink(a, 0, N);  // N-1后,重新下沉调整有序堆a[0..N]
        }
    }
private static void exch(Comparable[] a, int i, int j) {
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
    private static void sink(Comparable[] a, int k, int N) {
        // 由上至下的堆有序化(下沉)
        while (2*k <= N) {
            int j = 2*k;
            if(j < N && less(a, j, j+1))
                j++;
            if(!less(a, k, j))
                break;
            exch(a, k, j);
            k = j;
        }
    }
private static boolean less(Comparable[] a, int i, int j) {
        return a[i].compareTo(a[j]) < 0;
    }

冒泡排序

算法原理:
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的数往上冒。
算法实现:

public static void sort(Comparable[] a) {
        boolean exchange;   // 交换标志
        for(int i = 0; i < a.length; i++) {
            exchange = false;   // 本趟排序开始前,交换标志设为假 
            for(int j = a.length-1; j > i; j--) {
                if(less(a[j], a[j-1])) {
                    exch(a, j, j-1);
                    exchange = true; // 发生了交换,故将交换标志置为真
                }
            }
            if(!exchange)   //本趟没有发生交换,提前终止算法  
                return;
        }
    }

使用样例

public static void main(String args[]) {
        HolidayDate newyears = new HolidayDate("newyears", 1, 1);
        HolidayDate valentine = new HolidayDate("valentine", 2, 14);
        HolidayDate christmas = new HolidayDate("christmas", 12, 25);
        HolidayDate birthday = new HolidayDate("birthday", 9, 3);
        HolidayDate dragonboat = new HolidayDate("dragonboat", 5, 5);
        HolidayDate teacher = new HolidayDate("dragonboat", 9, 10);
        HolidayDate midautumn = new HolidayDate("midautumn", 8, 15);
        HolidayDate[] holiday = {christmas, birthday, teacher, newyears, midautumn,
                valentine, dragonboat};
        sort(holiday);
        show(holiday);
    }

性能比较

参考资料

《Algorithms -Fourth Edition》Robert Sedgewick&&Kevin Wayne著

LIN总线CAPL函数实战——动态控制报文发送(linDeactivateSlot与linActivateSlot) 本文深入解析了LIN总线测试中动态控制报文发送的核心CAPL函数linDeactivateSlot与linActivateSlot的实战应用。通过详细拆解函数参数、生效范围及限制,并结合故障注入、功耗测试等实际场景的代码示例,指导测试工程师在仿真LIN主节点时,灵活调度报文发送,实现高效自动化测试。 阅读详情

相关推荐

保姆级教程:IAR for STM8 3.11版本安装与破解全流程(附资源包)

本文提供IAR for STM8 3.11版本的详细安装与破解教程,涵盖环境准备、主程序安装、许可配置及实战验证全流程。针对新手常见问题,如许可证报错、驱动安装失败等,给出了具体解决方案,帮助开发者快速搭建稳定的STM8开发环境。

study的专栏 952

Java、泛型冒泡排序

代码】Java、泛型冒泡排序。

m0_62659797的博客 593

电机控制必看!SVPWM谐波优化:5段式与7段式全参数对比测试

本文通过实测数据,对比分析了电机控制中5段式与7段式SVPWM控制算法的谐波性能。实验表明,7段式SVPWM在电流波形质量(THD)和低速性能上更优,而5段式SVPWM则在开关损耗和效率方面表现突出。文章为工程师在不同应用场景(如对噪音、效率或动态响应的侧重)下的算法选型提供了清晰的依据和实用的工程指南。

weixin_28331555的博客 178

Java排序之冒泡排序

冒泡排序算法是一种较简单的排序算法,重复访问要排序的元素时,会依次比较相邻的两个元素,如果左边的元素大于右边的元素,就将二者交换,如此重复,直到没有相邻元素需要交换位置,排序完成。 1.普通冒泡排序 在这里插入代码片 2.加强冒泡排序(引入泛型和Comparable接口) /*冒泡排序*/ import java.util.Arrays; public class TestBubbleSort { public static <T>void swap(T[] arr ,int ind

weixin_45523449的博客 284

Maltab GUI课程设计——网络爬虫程序(基金连涨连跌提醒)

Maltab GUI课程设计——网络爬虫程序(基金连涨连跌提醒)

果果爱腰果的博客 850

第 2 章:PassThrough 直通滤波

通过设置某个维度(如 x、y、z 或 rgb)的取值范围,仅保留该范围内的点,从而达到**点云裁剪(裁边)**或过滤异常值的目的。所有在该范围之外的点会被移除(可选是否保留);点云中包含背景、地面或传感器噪声,需要过滤;通过 z 轴过滤,只保留桌面上方的物体;多轴组合过滤(如同时过滤 x、y、z);可用于地面剔除、车载点云预处理等场景。不支持一次过滤多个字段,可多次调用;仅处理某一层或某一区域的点云数据。原始点云中包含地面、墙面、背景等;在区域裁剪、前景提取中广泛使用;设定一个轴(如z轴);

yumeiguo的博客 337

java泛型 排序_[基础]-Java泛型

一、概述Java 泛型(generics)是 JDK 5中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。Java 泛型可以实现一个排序方法,能够对整型数组、字符数组甚至其他任何类型数组进行排序之类的功能。二、泛型方法 ``相关定义及其规则泛型方法在调用时可以接收不同类型的参数。根据传...

weixin_28983061的博客 575

Raspberry Pi Pico + Inmp441麦克风(Pio模拟I2s)<2>

摘要:本文介绍了在Raspberry Pi Pico上使用PIO(Programmable I/O)接收I2S数字麦克风音频数据并保存为WAV文件的方法。项目采用双PIO状态机设计,一个生成I2S时钟信号(WS+SCK),另一个接收24位左声道数据并转换为16位格式。文章详细说明了接线方式、参数设置、WAV文件头构造、PIO汇编程序实现以及数据转换处理流程。项目在MicroPython环境下实现16kHz采样率、6秒时长录音,具有时序精确、稳定可靠的特性,并提供了进一步拓展的可能性,如双声道支持、实时频谱分

技术需要沉淀,需要碰撞。 660

java泛型排序_详解Java中使用泛型实现快速排序算法的方法

快速排序算法概念快速排序一般基于递归实现。其思路是这样的:1.选定一个合适的值(理想情况中值最好,但实现中一般使用数组第一个值),称为“枢轴”(pivot)。2.基于这个值,将数组分为两部分,较小的分在左边,较大的分在右边。3.可以肯定,如此一轮下来,这个枢轴的位置一定在最终位置上。4.对两个子数组分别重复上述过程,直到每个数组只有一个元素。5.排序完成。基本实现方式:public static ...

weixin_33716616的博客 1012

华为OD机考双机位C卷 - 虚拟理财游戏(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 虚拟理财游戏(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 668

RDKit | 基于Pytorch和RDKit建立QSAR模型

QSAR 定量构效方法(quantitative structure-activity relationship, QSAR)是应用最为广泛的药物设计方法。所谓定量构效方法就是通过一些数理统计方法建立其一系列化合物的生理活性或某种性质与其物理化学性质之间的定量关系,通过这些定量关系。可以预测化合物的生理活性或某些性质,指导我们设计出具有更高活性的化合物。 早在...

DrugOne 5078

Java实现冒泡排序

冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序的时间复杂度是On2,所以它并不适合对大数据集进行排序。

欢迎来到多多的游乐园! 4021

修复Oracle MySQL Server 安全漏洞(CVE-2023-0464)

修复Oracle MySQL Server 安全漏洞(CVE-2023-0464)

路~可以走过 3683

Java使用泛型实现选择排序算法

简单来说算法是一种解决问题的步骤,我们今天来解决的问题就是把一串数据按照一定的规则进行排序,我们可能并不知道排序的数据是什么类型,所以我们用泛型来描述数据类型。 在下列一串数据中,我们如何进行排序呢 {5 , 2 , 6 , 3 , 4 , 8 , 9 , 1 , 7 , 10} 首先我们要获得的是第一个数据是最小值,然后依次往右越来越大,所以先把最小的1放到第一个位置上,然后再把2放到第二个位置...

m0_38105115的博客 1650

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java泛型排序_Java泛型-实现选择排序算法

package com.yuyong.alorithms;//import java.util.ArrayList;import java.util.List;public class SelectionSort {/*** @param args*/List T;// public SelectionSort() {// this.template = new ArrayList();// }p...

weixin_39805364的博客 168

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

java算法排序的泛型_Java泛型实现排序算法

package sort;import java.util.Arrays;import java.util.Comparator;/***** @author QuPeng**/public class GenericSortAlgorithm {/*** @param args*/public static void main(String[] args) {Integer[] array = ...

weixin_42438750的博客 198

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java泛型实现排序算法

使用Java泛型实现了快速排序算法

yunyun1886358的专栏 6358

java算法排序的泛型_Java泛型-实现选择排序算法

package com.yuyong.alorithms;//import java.util.ArrayList;import java.util.List;public class SelectionSort {/*** @param args*/List T;// public SelectionSort() {// this.template = new ArrayList();// }p...

weixin_31134719的博客 172

java排序算法 泛型排序_插入排序思路与泛型版本的实现

评论#re: 插入排序思路与泛型版本的实现2008-06-12 00:16eastmountain很好,我也在这个基于泛型的算法,但是好多类都不是很清楚。所以刚刚放弃,看见你写的大受启发。呵呵,谢谢了。回复更多评论#re: 插入排序思路与泛型版本的实现2008-06-12 10:56盐田酒店#re: 插入排序思路与泛型版本的实现2008-06-13 02:02小梅沙听涛酒店#re:...

weixin_36300491的博客 223

Java泛型知识整理

假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现? 答案是可以使用Java 泛型。 使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型将原来的具体的类型参数化, 类似于方法中的变量参数,此时类型也定义成参数形式..

printsky的博客 298

Java泛型选择排序

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34259159的博客 308

java中,使用泛型方法,如何比较大小

本人尝试写一个排序的泛型方法,结果因为需要用到compareTo。但在编译器编译的时候发现,并不能使用。 后来翻书的时候发现,需要将&lt;T&gt;写成&lt;T extends Comparable&gt;,才能使用compareTo函数!   而对于泛型构造数组,不能用new&lt;T&gt;来构造,只能用 str=(T[])Array.newInstance(a.getClass...

hgtjcxy的博客 8271

排序算法 java实现

几个排序算法,我是按照算法的伪代码用java实现的,刚开始是int类型的,后来换成泛型。 这是好早之前写的代码了,现在那出来温习下,就当是准备面试把 1.简单选择排序 这个算法应该是最简单的把,就是在数组中从头开始循环,选择最小的放在最前面,这个应该很好实现就不废话了 public static <T extends Comparable<T>> T[]...

weixin_30319097的博客 72

数据结构之选择排序(泛型改造)

public class SelectionSort { private SelectionSort(){}; //泛型方法,必须可比较的 public static <E extends Comparable<E>> void sort(E[] arr){ for (int i = 0; i < arr.length; i++) { int minIndex = i; //查找数组里面最.

weixin_45851729的博客 146

java实现容器、泛型等排序

public class Utils { public static &lt;T extends Comparable&lt;T&gt;&gt; void sort(List&lt;T&gt; list) { //容器排序 Object[] arr=list.toArray(); sort(arr); for(int i=...

OliverQueen的博客 297

泛型和项目

泛型和项目 1. 泛型 1.1 泛型概述 润物细无声!!! 泛型其实也是一种归纳总结思想的提升,对于数据处理的范围,参数的类型,方法操作的数据... 进行了二次剥离!!! 代码中使用泛型之后,可以极大的提高对于代码的复用性,可移植性,可操作性。 1.2 泛型格式 Java中泛型规定: <自定义无意义英文大写单字母占位符> 一般常用: <T> Type <E> Element <K> Key <V> Value 泛型可以

qq_40298175的博客 158
上一篇: 最长递增子序列(LIS)问题
Nim的辙迹
博客等级 码龄10年 17粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值