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

Java排序算法大全:实现常用的排序算法 排序算法是计算机科学中常用的重要算法之一,它可以将一组元素按照特定的顺序进行排列。在Java编程中,我们经常需要使用排序算法对数据进行排序,以便更方便地进行查找和处理。本文将介绍几种常用的排序算法,并提供相应的Java代码实现。以上是四种常用的排序算法的Java实现。在实际应用中,根据排序数据的规模和特点,选择合适的排序算法可以提高程序的效率和性能。除了上述介绍的排序算法,还有许多其他排序算法,如归并排序、堆排序等,读者可以进一步研究和实践。希望本文对你理解和实践Java中的排序算法有所帮助! 阅读详情

排序总结

稳定

sort最差时间最好时间平均时间稳定空间复杂度
冒泡排序O(n^2)O(n)O(n^2)稳定O(1)
插入排序O(n^2)O(n)O(n^2)稳定O(1)
二叉树排序O(n^2)O(nlogn)O(nlogn)稳定O(n)
归并排序lO(nlogn)O(nlogn)O(nlogn)稳定O(n)

不稳定

sort最差时间最好时间平均时间稳定空间复杂度
选择排序O(n^2)O(n^2)O(n^2)不稳定O(1)
快排O(n^2)O(nlogn)O(nlogn)不稳定O(logn~ O(n))
堆排序O(nlogn)O(nlogn)O(nlogn)不稳定O(1)
希尔排序O(n^2)不稳定O(1)

冒泡排序(Bubble Sort)

它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾!采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!
在这里插入图片描述

/*
 * a -- 待排序的数组
 * n -- 数组的长度
 */
public static void bubbleSort(int[] a, int n) {
    int i,
    j;
    for (i = n - 1; i > 0; i--) {
        // 将a[0...i]中最大的数据放在末尾
        for (j = 0; j < i; j++) {
            if (a[j] > a[j + 1]) {
                // 交换a[j]和a[j+1]
                int tmp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = tmp;
            }
        }
    }
}


运行:
int[] a = {20,40,30,10,60,50,70};
String aa = "冒泡排序";
bubbleSort(a, a.length);
System.out.print(aa);
for (int d: a) {
    System.out.print(d + ",");
}

选择排序和插入排序都是在冒泡基础上的演进:
选择排序:选出最小的值放入列表,选完即可
直接插入排序:左侧为有序队列,从右侧遍历的数字在放入左侧有序队列时排序插入。

直接插入排序(Straight Insertion Sort)

/**
 * @param 
 * a -- 待排序的数组
 * n -- 数组的长度
 */
public static void insertSort(int[] a, int n) {
    int i,j,k;
    for (i = 1; i < n; i++) {
    	//a[i]为右侧遍历出的待插数据
        //在有序队列a[0,i]中为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
        for (j = i - 1; j >= 0; j--) if (a[j] < a[i]) break;//从大到小找到比i小的值j即可终止
        //如找到了一个合适的位置, 把整个数组下标大于j的值都往后移动一个空位给i使用
        if (j != i - 1) {
            //将比a[i]大的数据向后移
            int temp = a[i];
            for (k = i - 1; k > j; k--) a[k + 1] = a[k];
            //将a[i]放到正确位置上
            a[k + 1] = temp;
        }
    }
}

和冒泡的规则相同,双重for循环找到最最小值

快速排序(Quick Sort)

使用分治法策略
它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序流程:
1.从数列中挑出一个基准值放入x。
2.将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置(把x赋值给中间值,完成一轮互换)。
3.递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序。

图文介绍
在这里插入图片描述

/**
 *
 * 参数说明:
 * a -- 待排序的数组
 * l -- 数组的左边界(例如,从起始位置开始排序,则l=0)
 * r -- 数组的右边界(例如,排序截至到数组末尾,则r=a.length-1)
 */
public static void quickSort(int[] a, int l, int r) {
    if (l < r) {
        int i,j, x;
        i = l;
        j = r;
        x = a[i];
        while (i < j) {
            while (i < j && a[j] > x) j--; // 从右向左找第一个小于x的数
            if (i < j) a[i++] = a[j];
            while (i < j && a[i] < x) i++; // 从左向右找第一个大于x的数
            if (i < j) a[j--] = a[i];
        }
        a[i] = x;//最后把基准值赋值给中间值,完成一轮替换
         /* 递归调用 */
        quickSort(a, l, i - 1);//把中间值左侧数据排序
        quickSort(a, i + 1, r);//右侧数据排序
        /* 递归调用 */
    }
}


//运行
 String aa = "快速排序";
 quickSort(a,0,a.length-1);
 System.out.print(aa);
 for (int d : a) {
 System.out.print(d+",");
 }

希尔排序shell sort

希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。该方法因DL.Shell于1959年提出而得名。

希尔排序的基本思想是:
1.把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
2.随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。

看图配合步骤讲解,第一次gap=5,每隔gap个元素为一组比大小;gap不断对折,直到gap=1完成排序。
在这里插入图片描述
初始时,有一个大小为 10 的无序序列。

在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。接下来,按照直接插入排序的方法对每个组进行排序。

在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。按照直接插入排序的方法对每个组进行排序。

在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。这样相隔距离为 1 的元素组成一组,即只有一组。按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。

需要注意一下的是,图中有两个相等数值的元素 5 和 5 。我们可以清楚的看到,在排序过程中,两个元素位置交换了。

所以,希尔排序是不稳定的算法。

/**
 * 希尔排序
 * @param list
 */
 public static void shellSort(int[] a) {
	 int gap = a.length / 2; //初始对折=步长
	 while (1 <= gap) {
		 // 把距离为 gap 的元素编为一个组,扫描所有组
		 for (int i = gap; i < a.length; i++) {
			 int j = 0;
			 int temp = a[i];
			 // 对距离为 gap 的元素组进行排序,每隔gap个为一组对比大小
			 for (j = i - gap; j >= 0 && temp < a[j]; j = j - gap) {
			 	a[j + gap] = a[j];
			 }
			 a[j + gap] = temp;
		 }
		 System.out.format("gap = %d:\t", gap);
		 printAll(a);
		 gap = gap / 2; // 减小增量
	 }
}
	 // 打印完整序列
 public static void printAll(int[] a) {
	 for (int value : a) {
	 System.out.print(value + "\t");
	 }
	 System.out.println();
 }

归并排序

基本思想
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

分而治之
在这里插入图片描述
和希尔排序的思想视乎有些相似,都是对折分组
可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。

每个小组最后都要面对的一步:合并相邻有序子序列
再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。
在这里插入图片描述
思路:创建一个两个数组长度之和的临时数组temp,两个数组对比,谁小就放入temp中。对比完成

public class MergeSort {
 public static void main(String []args){
	 int []arr = {9,8,7,6,5,4,3,2,1};
	 sort(arr);
	 System.out.println(Arrays.toString(arr));
 }

 public static void sort(int []arr){
	 int []temp = new int[arr.length];
	 //在排序前,先建好一个长度等于原数组长度的临时数组,
	 //避免递归中频繁开辟空间
	 sort(arr,0,arr.length-1,temp);
 }
 
 private static void sort(int[] arr,int left,int right,int []temp){
	 if(left<right){
		 int mid = (left+right)/2;
		 sort(arr,left,mid,temp);//递归调用:左边归并排序,使得左子序列有序
		 sort(arr,mid+1,right,temp);//递归调用:右边归并排序,使得右子序列有序
		 merge(arr,left,mid,right,temp);//将两个有序子数组合并操作
	 }
 }
 private static void merge(int[] arr,int left,int mid,int right,int[] temp){
	 int i = left;//左序列指针
	 int j = mid+1;//右序列指针
	 int t = 0;//临时数组指针
	 while (i<=mid && j<=right){
		 if(arr[i]<=arr[j]){
		 	temp[t++] = arr[i++];
		 }else {
			 temp[t++] = arr[j++];
		 }
	 }
	 while(i<=mid){//将左边剩余元素填充进temp中
	 temp[t++] = arr[i++];
	 }
	 while(j<=right){//将右序列剩余元素填充进temp中
	 temp[t++] = arr[j++];
	 }
	 t = 0;
	 //将temp中的元素全部拷贝到原数组中
	 while(left <= right){
	 arr[left++] = temp[t++];
	 }
 }
}

堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。

  • 完全二叉树: 除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐。
  • 满二叉树:除了叶子结点之外的每一个结点都有两个孩子,每一层(当然包含最后一层)都被完全填充。
  • 完满二叉树:除了叶子结点之外的每一个结点都有两个孩子结点。

完全二叉树(Complete Binary Tree):
在这里插入图片描述
满二叉树(Perfect Binary Tree):
在这里插入图片描述
完满二叉树(Full Binary Tree):
在这里插入图片描述
参考资料:
http://www.cnblogs.com/idorax/p/6441043.html

堆排序是将数据看成是完全二叉树、根据完全二叉树的特性来进行排序的一种算法
最大堆要求节点的元素都要不小于其孩子,
最小堆要求节点元素都不大于其左右孩子
处于最大堆的根节点的元素一定是这个堆中的最大值

完全二叉树有个特性:
左边子节点位置 = 当前父节点的两倍 + 1
右边子节点位置 = 当前父节点的两倍 + 2

节点的关系和节点编号和数组下标对象的下标关系:
在这里插入图片描述

排序过程
第一步:先n个元素的无序序列,构建成大顶堆
第二步:将根节点与最后一个元素交换位置,(将最大元素"沉"到数组末端)
第三步:交换过后可能不再满足大顶堆的条件,所以需要将剩下的n-1个元素重新构建成大顶堆
第四步:重复第二步、第三步直到整个数组排序完成
在这里插入图片描述

/**
     * 建堆
     *
     * @param arrays          看作是完全二叉树
     * @param currentRootNode 当前父节点位置
     * @param size            节点总数
     */
    public static void heapify(int[] arrays, int currentRootNode, int size) {

       if (currentRootNode < size) {
           //左子树和右字数的位置
           int left = 2 * currentRootNode + 1;
           int right = 2 * currentRootNode + 2;

           //把当前父节点位置看成是最大的
           int max = currentRootNode;

           if (left < size) {
               //如果比当前根元素要大,记录它的位置
               if (arrays[max] < arrays[left]) {
                   max = left;
               }
           }
           if (right < size) {
               //如果比当前根元素要大,记录它的位置
               if (arrays[max] < arrays[right]) {
                   max = right;
               }
           }
           //如果最大的不是根元素位置,那么就交换
           if (max != currentRootNode) {
               int temp = arrays[max];
               arrays[max] = arrays[currentRootNode];
               arrays[currentRootNode] = temp;

               //继续比较,直到完成一次建堆
               heapify(arrays, max, size);
           }
       }
   }



  /**
    * 完成一次建堆,最大值在堆的顶部(根节点)
    */
   public static void maxHeapify(int[] arrays, int size) {

       // 从数组的尾部开始,直到第一个元素(角标为0)
       for (int i = size - 1; i >= 0; i--) {
           heapify(arrays, i, size);
       }

   }

	//堆排序入口
public static void heapSort(int[] arrays) {
	for (int i = 0; i < arrays.length; i++) {
        //每次建堆就可以排除一个元素了
        maxHeapify(arrays, arrays.length - i);
        //把顶部最大值放到数组最后面
        int temp = arrays[0];
        arrays[0] = arrays[(arrays.length - 1) - i];
        arrays[(arrays.length - 1) - i] = temp;
    }
}


java8新特性将List中按指定属性排序过滤重复数据的方法 主要介绍了java8新特性将List中按指定属性排序过滤重复数据的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下 立即下载

相关推荐

基于PyTorch的BP神经网络PID控制器动态调参实战

本文详细介绍了基于PyTorch的BP神经网络PID控制器动态调参实战,结合BP神经网络的自适应能力和PID控制算法的经典优势,实现工业控制中的高效参数调整。通过PyTorch实现BP-PID融合架构,包括网络设计、损失函数优化及动态调参技巧,显著提升控制性能,适用于温度控制、电机控制等场景。

weixin_29094775的博客 520

面试100题53--字符串全排列

题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 #include <iostream> #include <string> #include <cstring> using namespace std; bool...

weixin_34121282的博客 228

Cursor聊天记录迁移工具:实现跨设备AI对话同步与备份

在软件开发中,数据持久化与迁移是常见需求,尤其当工具依赖本地存储时。SQLite作为轻量级关系型数据库,因其嵌入式、零配置特性,常被用于存储应用状态与用户数据。其WAL(预写式日志)模式提升了并发性能,但也增加了数据操作复杂性。通过命令行工具与JSON序列化技术,可以实现结构化数据的提取、转换与安全迁移,这对于保障开发资产的连续性与可移植性具有重要价值。例如,在AI辅助编程场景下,开发者与AI的对话记录包含关键的问题分析、解决方案与决策逻辑,是重要的上下文资产。cursor-chat-transfer工具正

weixin_42551967的博客 533

java实现不重复数组的全排列

一 算法思想 思路:全排列可以理解是一个树的递归的过程,每一个递归过程中的叶子结点就是一种可能的排列方式。利用递归可以很好的帮我们实现下面这颗树的完成深度优先遍历,得到我们想要的全排列。 二 编码实现 public static List<List<Integer>> fullArray(List<Integer> number) { List<List<Integer>> result = Lists.

0bug0warning的博客 1588

方差分析ANOVA、T检验、卡方检验的区别

T检验和ANOVA都是用来看样本之间均值是否相等,但是两者又有什么区别呢? 卡方检验是用来看分类变量之间有没有相关性。 自变量X类型 自变量X组数 因变量Y类型 分析方法 离散(类别) 仅仅2组 连续(均值) t检验 离散(类别) 2组及以上 连续(均值) ANOVA 离散(类别) 2组及以上 离散(类别) 卡方检验 进一步细分 方差分析 从理论上讲,方差分析有两个前提条件,一是因变量Y需要满足正态性要求,二是满足方差齐检验。 方差不齐时可使用‘非参数检验’,同时还可使用wel

itslifeng的博客 4万+

FC7300 SPI MCAL配置引导

Example - QMI8A01z外设:Example - QMI8A01z外设:

舊梦的博客 257

[Java]集合中数据排序与避免重复

各种集合的特点以及关系 List: 对付顺序的好帮手 一种知道索引位置的集合; 可以有元素重复; Set: 注重独一无二的性质 不允许重复的集合; 无序 Map: 用key来搜索的专家 使用成对的键值和数据值; key不允许重复; 不同key可以引用相同的value; List中的数据如何排序 List自己的API是没有排序的,需要借助Collectio.sort() 如果是内置类型,比如St

WificamSDK7的专栏 1469

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

努力让自己发光,对的人才能迎着光而来 9万+

java实现全排列(无重复)

全排列 全排列就是将一串数字排列组合 列出所有的情况,分成有重复的和无重复的,一般来说没有重复数字的比有重复数字的更难的一些,不过大体思路都差不多,都需要用到回溯算法 整体思路: 1.就是把数字一个一个遍历,发现符合条件就加进去,不符合条件的就跳出去,那么这个容器就用ArrayList的形式 那么代码就是:· public class number{ static ArrayList<String> w = new ArrayList();//符合条件的一组,就往里面装,装的是String类型

小海同学的博客 2486

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

WW、forever的博客 1964

日常工作记录---在虚拟机中进行slam建图

   今天是10月24号,首先祝各位程序员们节日快乐!!!    最近一周由于实习的原因,对ROS的探索学习,停滞了一段时间,所以今天也就没什么大的进展,本篇文章仅仅记录一下,我在虚拟机中进行slam建图可行性验证的过程,本篇文章同样使用古月学院《如何在Gazebo中实现阿克曼转向车的仿真》的课程资料来进行验证    下面各条之间并没有严格的顺序关系,每一条都是独立的,都是我在验证过程中的经验或者记录:    1、在运行roslaunch bringup racecar_gazebo_rviz.lau

慕羽★的博客 4826

常用排序算法的java实现

/** * 冒泡排序 * 时间复杂度: 最小 = O(n), 最大 = O(n^2), 平均 = O(n^2) * * @param data 待排序序列 * @return */ public static int[] bubbleSort(int[] data) { if (data == null || data.length == 0 || data.length =...

LittleBeen 288

基于STM32的室内环境监测系统设计与实现

摘要 本文设计了一种基于STM32的室内环境监测系统,通过传感器实时采集温湿度、空气质量、烟雾浓度等数据,并利用Wi-Fi模块上传至云服务器。系统采用STM32F103C8T6作为主控芯片,结合DHT11、MQ系列传感器及BMP280气压传感器实现数据采集,通过ESP8266模块实现远程数据传输。用户可通过手机APP实时查看环境参数,并在数据超标时触发报警。实验表明,系统运行稳定,监测精度高,具有低成本、易扩展等特点,为改善室内环境质量提供了有效解决方案。 关键词:STM32;室内环境监测;传感器;Wi-F

3254968421的博客 221

[转载] java实现四种常用排序算法

参考链接: 用Java排序 四种常用排序算法 ##注:从小到大排 ##冒泡排序## 特点:效率低,实现简单 思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。这只是冒泡排序的一种,当然也可以从后往前排。 public void bubbleSort(int array[]) { int t = 0; for (int i = 0; i < array.length - 1; i++) ...

ld909的博客 76

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

用 Java 实现的八种常用排序算法

八种排序算法可以按照如图分类 交换排序 所谓交换,就是序列中任意两个元素进行比较,根据比较结果来交换各自在序列中的位置,以此达到排序的目的。 1. 冒泡排序 冒泡排序是一种简单的交换排序算法,以升序排序为例,其核心思想是: 从第一个元素开始,比较相邻的两个元素。如果第一个比第二个大,则进行交换。 轮到下一组相邻元素,执行同样的比较操作,再找下一组,直到没有相邻元素可比较为止,此时最后的元素应是最大的数。 除了每次排序得到的最后一个元素,对剩余元素重复以上步骤,直到没有任何一对元素需要比较为止。 ..

低吟不作语的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java实现四种常用排序算法

四种常用排序算法 冒泡排序 特点:效率低,实现简单 思想(从小到大排):每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。这只是冒泡排序的一种,当然也可以从后往前排。 public void bubbleSort(int array[]) { int t = 0; for (int i = 0; i &amp;amp;lt;...

huosanghuakai 10万+

深度学习工具包 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常用的八种排序算法与代码实现一、直接插入排序算法1.1 基本思想:1.2 代码实现二、直接插入排序算法2.1 基本思想 一、直接插入排序算法 1.1 基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。 实例: 初始状态...

HDMI小不点 377

一篇搞懂 Java 常用排序算法:从原理到实现

本文详细介绍了8种常用排序算法及其Java实现,包括插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序和计数排序。每种算法从核心思想、实现代码到性能分析(时间复杂度、空间复杂度、稳定性)进行全方位解析,并针对特定算法提供优化版本(如快速排序的递归和非递归实现)。文章还特别介绍了排序算法的基础概念(稳定性、时空复杂度等),帮助读者全面理解排序算法的特性和适用场景。所有代码均封装完整,可直接运行测试,适合需要系统学习排序算法的开发者和算法爱好者。

2402_86887479的博客 1834

我们一起来排序——使用Java语言优雅地实现常用排序算法

排序算法——最基础的算法,互联网面试必备技能。春来来了,排序的季节来了!本文使用Java语言优雅地实现常用排序算法,希望对大家有帮助,早日拿到Offer!

码上暴富 257

常用的八种排序算法Java代码实现

package algorithm; import java.util.Arrays; public class EightAlgorithm { /** * * 常用的八种排序算法Java代码实现 * 时间:2018-9-5-下午9:14:30 * 邮件:hasp_Jason@163.com * @exception * 辅助记忆 * 时间复杂度记忆- ...

JZ 8863

使用JAVA实现几种常用的排序算法,浅谈算法。

小编在这篇博客中对JAVA程序员需要了解的排序算法做一个介绍并附带实现代码,希望可以对你们有所帮助,若有所不足请在下方继续评论,谢谢支持。 算法的分类  1.交换排序 (冒泡排序,快速排序)    2.插入排序 (直接插入排序,希尔排序)  3.选择排序 (直接选择排序,堆排序)  4.归并排序 5.分配排序 (基数排序)    冒泡排序 冒泡排序(Bubble So

qq_36503722的博客 442

常用排序算法 Java 实现

本文是对《算法 第四版》中排序章节的总结,包括 选择排序,插入排序,希尔排序,归并排序,快速排序,堆排序和冒泡排序各种排序算法的性能特点有多种排序算法存在,就是因为各种算法拥有不同的性能特点,各有所长,适用于不同场合,下面是书中对各种排序算法的性能特点的总结: 算法 是否稳定 是否为原地排序 时间复杂度 空间复杂度 备注 选择排序 否 是 N^2 1

classTC的博客 1247

java实现常用排序算法

数组排序问题是java工程师面试过程中很常见的问题之一,也是java程序员必备的知识。本文总结了用java实现常用的排序算法。 注:数组从小到大排序 1. 冒泡排序 特点:效率低,实现简单,容易理解 思想:每一次遍历,将待排序中最大的元素移到最后,剩下的为新的待排序序列,重复上述步骤直至排序完所有元素。 代码实现: public void bubbleSort(int array[]...

gaojin630的博客 187
上一篇: BloomFilter使用和redis的setbit、bitcount实现用户上线次数统计
下一篇: Spring Cloud Gateway的路由,过滤器和限流
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值