首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Java数据结构和算法】012-排序:快速排序*、归并排序*、基数排序(桶排序)、堆排序、排序算法比较

【Java数据结构和算法】012-排序:快速排序*、归并排序*、基数排序(桶排序)、堆排序、排序算法比较

作者头像
訾博ZiBo
发布于 2025-01-06 08:37:41
发布于 2025-01-06 08:37:41
13300
代码可运行
举报
运行总次数:0
代码可运行

一、快速排序

1、介绍

快速排序(Quicksort)是对冒泡排序的一种改进;

2、基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列;

3、思路图解

4、代码演示

代码实现[不易理解,看注释解释]:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zb.ds.sort;

import java.util.Arrays;

//快速排序
public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {-9,-8,-7,0,-3,2,-5,9};
        sort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr,int left,int right){
        int l = left;//左下标
        int r = right;//右下标
        //pivot:中轴
        int pivot = arr[(l + r)/2];
        int temp;//临时变量,交换时使用
        //while循环的目的是让比pivot小的放到左边,大的放到右边
        while (l<r){
            //一个循环从左往右,另一个循环从右往左,都好像是在“清除异己”,小于pivot就是左阵营,大于pivot就是右阵营,等于的话都可以
            //左阵营每挑出来一个右阵营的就拿去和有阵营挑出来的交换,甚至其中一个阵营没有“异己”了,就拿pivot去交换
            //这个时候,右阵营发现左阵营拿pivot跟自己交换,很不开心,要求左阵营往后走一步,这件事情对于左阵营也是这样操作的
            //依此循环,目标是pivot左边全部是小于等于pivot的,右边全部是大于等于pivot的
            //我们再思考一下满足的条件:左阵营找找找,没找到“异己”,右阵营也找找找,一直找不到“异己”,
            //知道左右阵容头碰头了(l=r),或者都找到对方阵营了(l>r),这个时候才做罢休!
            //这个时候就可以了退出了,完成任务了,但是退出的条件是l>=r,很显然此时l不一定>=r,因为pivot这个值可能不是唯一的,意思是
            //在pivot左边一直找,找到一个大于等于pivot的值才退出
            //从左往右,找一个比pivot大的值
            while (arr[l]<pivot){
                l++;
            }
            //这个时候l最大的可能是比r小
            //这个时候找到的下标可能是pivot所在的下标,因为这个时候pivot前面的数全部比pivot小,
            //只有找到了他自己才符合跳出循环的条件,所以下标l对应的值应该就是pivot
            //在pivot右边一直找,找到一个小于等于pivot的值才退出
            //从右往左,找一个比pivot小的值
            while (arr[r]>pivot){
                r--;
            }
            //这个时候r最大的可能是比l大
            //这个时候找到的下标可能是pivot所在的下标,因为这个时候pivot后面的数全部比pivot大,
            //只有找到了他自己才符合跳出循环的条件,所以下标l对应的值应该就是pivot
            //如果l>=r,说明pivot的左边的值是小于等于pivot的值,右边全部是大于等于pivot的值
            //这个地方不好理解,首先要明白pivot是一个值,无关下标,pivot也只是一个普通的arr[l]或者arr[r],会随着规则移动位置
            //
            if(l>=r){
                break;
            }
            //交换
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            //如果交换之后发现arr[l]=pivot,r--,前移
            if(arr[l]==pivot){
                r--;
            }
            //如果交换之后发现arr[r]=pivot,l++,后移
            if(arr[r]==pivot){
                l++;
            }
        }
        //在这之前,我们进行了一次阵营查找,下面再将左右阵营分别再划分左右阵营进行“排除异己”操作
        //如果l=r,那么这个下标的值就不进行操作了,因为它会始终位于两大阵营中间,也选出了一个数,所有的顺序产生机制就是通过这个方法得出“中间值”
        //如果l=r,必须l++,r--,否则会出现栈溢出
        if(l==r){
            l++;
            r--;
        }
        //递归实现阵营的划分
        //向左递归
        if(left<r){
            sort(arr,left,r);
        }
        //向右递归
        if(right>l){
            sort(arr,l,right);
        }
    }
}
运行结果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[-9, -8, -7, -5, -3, 0, 2, 9]

5、速度测试

代码实现:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zb.ds.sort;

import java.util.Random;

//快速排序
public class QuickSort {
    public static void main(String[] args) {
        int[] nums = new int[80000];
        for (int i = 0; i < 80000; i++) {
            nums[i] = new Random().nextInt(8000000);
        }
        //排序前时间
        long start = System.currentTimeMillis();
        System.out.println("排序前时间:" + start);
        sort(nums,0,79999);
        //排序后时间
        long end = System.currentTimeMillis();
        System.out.println("排序后时间:" + end);
        //程序执行时间
        System.out.println("程序执行时间为:" + (end-start)/1000 + "秒!");
    }
    public static void sort(int[] arr,int left,int right){
        int l = left;//左下标
        int r = right;//右下标
        //pivot:中轴
        int pivot = arr[(l + r)/2];
        int temp;//临时变量,交换时使用
        //while循环的目的是让比pivot小的放到左边,大的放到右边
        while (l<r){
            //一个循环从左往右,另一个循环从右往左,都好像是在“清除异己”,小于pivot就是左阵营,大于pivot就是右阵营,等于的话都可以
            //左阵营每挑出来一个右阵营的就拿去和有阵营挑出来的交换,甚至其中一个阵营没有“异己”了,就拿pivot去交换
            //这个时候,右阵营发现左阵营拿pivot跟自己交换,很不开心,要求左阵营往后走一步,这件事情对于左阵营也是这样操作的
            //依此循环,目标是pivot左边全部是小于等于pivot的,右边全部是大于等于pivot的
            //我们再思考一下满足的条件:左阵营找找找,没找到“异己”,右阵营也找找找,一直找不到“异己”,
            //知道左右阵容头碰头了(l=r),或者都找到对方阵营了(l>r),这个时候才做罢休!
            //这个时候就可以了退出了,完成任务了,但是退出的条件是l>=r,很显然此时l不一定>=r,因为pivot这个值可能不是唯一的,意思是
            //在pivot左边一直找,找到一个大于等于pivot的值才退出
            //从左往右,找一个比pivot大的值
            while (arr[l]<pivot){
                l++;
            }
            //这个时候l最大的可能是比r小
            //这个时候找到的下标可能是pivot所在的下标,因为这个时候pivot前面的数全部比pivot小,
            //只有找到了他自己才符合跳出循环的条件,所以下标l对应的值应该就是pivot
            //在pivot右边一直找,找到一个小于等于pivot的值才退出
            //从右往左,找一个比pivot小的值
            while (arr[r]>pivot){
                r--;
            }
            //这个时候r最大的可能是比l大
            //这个时候找到的下标可能是pivot所在的下标,因为这个时候pivot后面的数全部比pivot大,
            //只有找到了他自己才符合跳出循环的条件,所以下标l对应的值应该就是pivot
            //如果l>=r,说明pivot的左边的值是小于等于pivot的值,右边全部是大于等于pivot的值
            //这个地方不好理解,首先要明白pivot是一个值,无关下标,pivot也只是一个普通的arr[l]或者arr[r],会随着规则移动位置
            //
            if(l>=r){
                break;
            }
            //交换
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            //如果交换之后发现arr[l]=pivot,r--,前移
            if(arr[l]==pivot){
                r--;
            }
            //如果交换之后发现arr[r]=pivot,l++,后移
            if(arr[r]==pivot){
                l++;
            }
        }
        //在这之前,我们进行了一次阵营查找,下面再将左右阵营分别再划分左右阵营进行“排除异己”操作
        //如果l=r,那么这个下标的值就不进行操作了,因为它会始终位于两大阵营中间,也选出了一个数,所有的顺序产生机制就是通过这个方法得出“中间值”
        //如果l=r,必须l++,r--,否则会出现栈溢出
        if(l==r){
            l++;
            r--;
        }
        //递归实现阵营的划分
        //向左递归
        if(left<r){
            sort(arr,left,r);
        }
        //向右递归
        if(right>l){
            sort(arr,l,right);
        }
    }
}
运行结果(8万数据,19毫秒):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
排序前时间:1606362043150
排序后时间:1606362043169
程序执行时间为:0秒!

80万数据,162毫秒;

800万数据,1秒425毫秒;

二、归并排序

1、介绍

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

2、思路图解

说明: 可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程;

再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤:

3、代码演示

代码实现:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zb.ds.sort;

import java.util.Arrays;

public class MergerSort {
    public static void main(String[] args) {
        int[] arr = {8,4,5,7,1,3,6,2};
        int[] temp = new int[arr.length];
        mergerSort(arr,0,arr.length-1,temp);
        System.out.println(Arrays.toString(arr));
    }

    public static void mergerSort(int[] arr,int left,int right,int[] temp){
        if(left<right){
            int mid = (left + right)/2;//中建索引
            //向左递归进行分解
            mergerSort(arr,left,mid,temp);
            //向右递归进行分解
            mergerSort(arr,mid+1,right,temp);
            //合并
            sort(arr,left,mid,right,temp);
        }
    }

    /**
     * 归并排序-合并
     * @param arr 待排序数组
     * @param left 左边有序序列的初始索引
     * @param mid 中间索引
     * @param right 右边索引
     * @param temp 做中转的数组
     */
    public static void sort(int[] arr,int left,int mid,int right,int[] temp){
        int i = left;//初始化i,左边有序序列的初始索引
        int j = mid + 1;//初始化j,右边有序序列的初始索引
        int t = 0;//指向temp数组的当前索引
        //第一步:
        //先把左右两边(有序)的数据按照规则填充到temp数组
        //直到左右两边有一边处理完毕为止
        while (i<=mid && j<=right){
            //如果发现左边序列的”当前元素“小于等于右边数列的当前元素,就把该元素放到中转数组的“当前位置”
            //然后左边序列的”当前位置“和中转数组的”当前位置“后移一位
            if(arr[i]<=arr[j]){
                temp[t] = arr[i];
                t++;
                i++;
            }else {//反之将右边序列的“当前元素”放到中转数组的“当前位置”
                temp[t] = arr[j];
                t++;
                j++;
            }
        }
        //第二步:
        //将有剩余数据的一方,依次填充到temp数组
        while (i<=mid){
            temp[t] = arr[i];
            t++;
            i++;
        }
        while (j<=right){
            temp[t] = arr[j];
            t++;
            j++;
        }
        //第三步:
        //将temp数组的元素拷贝到arr
        //注意:并不是每次都拷贝所有
        t = 0;
        int tempLeft = left;
        //第一次合并时,tempLeft=0,right=1;//第二次:tL=2,r=3//第三次:tl=0.r=3//...
        //最后一次:tempLeft=0,right=7;
        while (tempLeft<=right){
            arr[tempLeft]  = temp[t];
            t++;
            tempLeft++;
        }
    }
}
运行结果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1, 2, 3, 4, 5, 6, 7, 8]

4、速度测试

代码实现:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zb.ds.sort;

import java.util.Random;

public class MergerSort {
    public static void main(String[] args) {
        int[] arr = new int[80000];
        for (int i = 0; i < 80000; i++) {
            arr[i] = new Random().nextInt(8000000);
        }
        int[] temp = new int[arr.length];
        //排序前时间
        long start = System.currentTimeMillis();
        System.out.println("排序前时间:" + start);
        mergerSort(arr,0,arr.length-1,temp);
        //排序后时间
        long end = System.currentTimeMillis();
        System.out.println("排序后时间:" + end);
        //程序执行时间
        System.out.println("程序执行时间为:" + (end-start)/1000 + "秒!");
    }

    public static void mergerSort(int[] arr,int left,int right,int[] temp){
        if(left<right){
            int mid = (left + right)/2;//中建索引
            //向左递归进行分解
            mergerSort(arr,left,mid,temp);
            //向右递归进行分解
            mergerSort(arr,mid+1,right,temp);
            //合并
            sort(arr,left,mid,right,temp);
        }
    }

    /**
     * 归并排序-合并
     * @param arr 待排序数组
     * @param left 左边有序序列的初始索引
     * @param mid 中间索引
     * @param right 右边索引
     * @param temp 做中转的数组
     */
    public static void sort(int[] arr,int left,int mid,int right,int[] temp){
        int i = left;//初始化i,左边有序序列的初始索引
        int j = mid + 1;//初始化j,右边有序序列的初始索引
        int t = 0;//指向temp数组的当前索引
        //第一步:
        //先把左右两边(有序)的数据按照规则填充到temp数组
        //直到左右两边有一边处理完毕为止
        while (i<=mid && j<=right){
            //如果发现左边序列的”当前元素“小于等于右边数列的当前元素,就把该元素放到中转数组的“当前位置”
            //然后左边序列的”当前位置“和中转数组的”当前位置“后移一位
            if(arr[i]<=arr[j]){
                temp[t] = arr[i];
                t++;
                i++;
            }else {//反之将右边序列的“当前元素”放到中转数组的“当前位置”
                temp[t] = arr[j];
                t++;
                j++;
            }
        }
        //第二步:
        //将有剩余数据的一方,依次填充到temp数组
        while (i<=mid){
            temp[t] = arr[i];
            t++;
            i++;
        }
        while (j<=right){
            temp[t] = arr[j];
            t++;
            j++;
        }
        //第三步:
        //将temp数组的元素拷贝到arr
        //注意:并不是每次都拷贝所有
        t = 0;
        int tempLeft = left;
        //第一次合并时,tempLeft=0,right=1;//第二次:tL=2,r=3//第三次:tl=0.r=3//...
        //最后一次:tempLeft=0,right=7;
        while (tempLeft<=right){
            arr[tempLeft]  = temp[t];
            t++;
            tempLeft++;
        }
    }
}
运行结果(8万数据,15毫秒):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
排序前时间:1606446334005
排序后时间:1606446334020
程序执行时间为:0秒!

三、基数排序(桶排序)

1、介绍

①基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用;

②基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法;

③基数排序(Radix Sort)是桶排序的扩展;

④基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较;

2、基本思想

将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列;

3、思路图解

将数组 {53,3,542,748,14,214} 使用基数排序,进行升序排序:

第1轮排序[按照个位排序]:

说明:事先准备10个数组(10个桶), 0-9 分别对应 位数的 0-9;

(1) 将各个数,按照个位大小放入到对应的各个数组中;

(2)  然后从0-9个数组/桶,依次按照加入元素的先后顺序取出;

第1轮排序后:542 53 3 14 214 748

第2轮排序[按照十位排序]:

(1) 将各个数,按照十位大小放入到对应的各个数组中;

(2)  然后从0-9个数组/桶,依次按照加入元素的先后顺序取出;

第2轮排序后: 3 14 214 542 748 53

第3轮排序[按照百位排序]:

(1) 将各个数,按照百位大小放入到对应的各个数组中;

(2)  然后从0-9个数组/桶,依次按照加入元素的先后顺序取出;

第3轮排序后:3 14 53 214 542 748

4、代码演示

代码实现:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zb.ds.sort;

import java.util.Arrays;

//基数排序(桶排序)
public class RadixSort {
    public static void main(String[] args) {
        int[] arr = {53, 3, 542, 748, 14, 214};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr){
        //拿到数组中最大的数的位数
        int max = arr[0];
        for (int value : arr) {
            if (value > max) {
                max = value;
            }
        }
        //最大的数的位数
        int maxLength = (max + "").length();
        //准备一个二维数组,表示10个桶,每一个桶就是一个一维数组
        //为了防止数据溢出,每个一维数组的长度为arr.length
        //用空间换时间的算法
        int[][] bucket = new int[10][arr.length];
        //为了记录每个桶中,实际存放了多少个数据,我们定义一个一维数组进行记录
        int[] bucketElementCounts = new int[10];
        //开始排序
        for (int x=0,n=1; x<maxLength; x++,n*=10) {
            //1、第1轮排序[按照个位排序]
            for (int value : arr) {
                //取出每个元素个位数的值
                int digitOfElement = value / n % 10;
                //放入到对应的桶中
                bucket[digitOfElement][bucketElementCounts[digitOfElement]] = value;
                bucketElementCounts[digitOfElement]++;//后移一位
            }
            //此时此刻,第一轮排序完毕,我们需要从0-9个数组/桶,依次按照加入元素的先后顺序取出
            int index = 0;
            //遍历每一个桶,并将所有数据放入原数组
            for (int i = 0; i < 10; i++) {
                //如果同种有数据,我们才放入原数组
                if(bucketElementCounts[i]!=0){
                    //有数据,遍历该桶
                    for (int j = 0; j < bucketElementCounts[i]; j++) {
                        arr[index] = bucket[i][j];
                        index++;
                    }
                    bucketElementCounts[i]=0;
                }
            }
        }
    }
}
运行结果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[3, 14, 53, 214, 542, 748]

5、速度测试

代码实现:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zb.ds.sort;

import java.util.Random;

//基数排序(桶排序)
public class RadixSort {
    public static void main(String[] args) {
        int[] arr = new int[80000];
        for (int i = 0; i < 80000; i++) {
            arr[i] = new Random().nextInt(8000000);
        }
        //排序前时间
        long start = System.currentTimeMillis();
        System.out.println("排序前时间:" + start);
        sort(arr);
        //排序后时间
        long end = System.currentTimeMillis();
        System.out.println("排序后时间:" + end);
        //程序执行时间
        System.out.println("程序执行时间为:" + (end-start)/1000 + "秒!");
    }
    public static void sort(int[] arr){
        //拿到数组中最大的数的位数
        int max = arr[0];
        for (int value : arr) {
            if (value > max) {
                max = value;
            }
        }
        //最大的数的位数
        int maxLength = (max + "").length();
        //准备一个二维数组,表示10个桶,每一个桶就是一个一维数组
        //为了防止数据溢出,每个一维数组的长度为arr.length
        //用空间换时间的算法
        int[][] bucket = new int[10][arr.length];
        //为了记录每个桶中,实际存放了多少个数据,我们定义一个一维数组进行记录
        int[] bucketElementCounts = new int[10];
        //开始排序
        for (int x=0,n=1; x<maxLength; x++,n*=10) {
            //1、第1轮排序[按照个位排序]
            for (int value : arr) {
                //取出每个元素个位数的值
                int digitOfElement = value / n % 10;
                //放入到对应的桶中
                bucket[digitOfElement][bucketElementCounts[digitOfElement]] = value;
                bucketElementCounts[digitOfElement]++;//后移一位
            }
            //此时此刻,第一轮排序完毕,我们需要从0-9个数组/桶,依次按照加入元素的先后顺序取出
            int index = 0;
            //遍历每一个桶,并将所有数据放入原数组
            for (int i = 0; i < 10; i++) {
                //如果同种有数据,我们才放入原数组
                if(bucketElementCounts[i]!=0){
                    //有数据,遍历该桶
                    for (int j = 0; j < bucketElementCounts[i]; j++) {
                        arr[index] = bucket[i][j];
                        index++;
                    }
                    bucketElementCounts[i]=0;
                }
            }
        }
    }
}
运行结果(8万数据,20毫秒):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
排序前时间:1606529012580
排序后时间:1606529012600
程序执行时间为:0秒!

800万数据,632毫秒!

8000万数据,5857毫秒!

但是基数排序比较吃内存!

四、堆排序

(学完二叉树,再学堆排序,这里暂时省略,之后补上)

五、排序算法比较

1、图示

(里面的计数排序和桶排序与基数排序思路大体一致)

2、说明

①稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;

②不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;

③内排序:所有排序操作都在内存中完成;

④外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;

⑤时间复杂度: 一个算法执行所耗费的时间;

⑥空间复杂度:运行完一个程序所需内存的大小。 n: 数据规模 k: “桶”的个数 In-place:    不占用额外内存 Out-place: 占用额外内存;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SMT贴片加工的焊点失效的原因您了解吗?
下面让专业的SMT工厂高拓电子给大家简单介绍一下焊点失效的主要因素。简单概括就以下几点。
高拓电子
2022/07/19
4500
浅谈smt真空回流焊的基本原理--高拓电子
随着元器件不断向小型化发展,芯片集成度越来越高,无论是笔记本、智能手机还是医疗器械、汽车电子,军工和航天产品,产品中的阵列封装的BGA、CSP等器件应用越来越多,对产品的质量要求也越来越多。这都需要我们不断的提高smt工艺能力,增加高端设备,通过高质量焊接保证高可靠性产品。
高拓电子
2021/11/29
9410
一分钟带您了解PCBA加工流程与优势!
PCBA加工是PCB裸板经过SMT贴片、DIP插件和PCBA测试,质检组装等制程之后,形成的一个成品,简称PCBA。是委托方交付加工项目给专业的PCBA加工厂,然后按双方约定时间等待加工厂家交付的成品。
高拓电子
2022/08/06
4810
焊接行业标准 IPC J-STD-006:电子产品的焊锡合金
全球电子行业采用无铅电子产品已经有近二十年了。在此期间,从事该行业的读者都认识到这个行业面临的变化和挑战,意识到要把铅(Pb)从电子产品中去除做起来没有那么简单。我认为,从一开始就要解决以下四个问题:
高拓电子
2022/09/22
2.1K0
IPC-J-STD-001标准动态
IPC J-STD-001焊接的电气及电子组件要求》的H版于2020年9月发布,它详述了制造电子组件时对材料和工艺的要求。过去一年,我最常被问到的问题之一是IPC J-STD-001H版有哪些大的变化。
高拓电子
2022/09/21
9010
PCB电路板焊接温度和时间的要求有哪些?
不同焊接方法和元件类型对温度和时间的要求各不相同,需要根据具体应用和材料特性精细调整工艺参数。
不脱发的程序猿
2024/12/09
6760
PCB电路板焊接温度和时间的要求有哪些?
PCB常见术语总结
PCB(Printed Circuit Board),中文名称为印制电路板;简称PCB;用于在绝缘基板(FR-4、CEM-1等材料做的基板)上印制电气连接线路,用于控制器电子元件的安装以及电气连接
ElectricDeveloper
2021/08/18
3.3K0
常见的几种PCB表面处理技术!
随着科技的不断进步。市场上对PCB线路板的质量要求也越来越严格,进而对PCB表面处理技术发展和升级也越来越紧迫。本文主要介绍了目前市场上常见的PCB的表面处理技术。
高拓电子
2022/07/25
1.1K0
波峰焊是什么意思,有什么作用?
波峰焊(Wave Soldering)是一种电子元件的焊接方式,它可以将大量的插件式元件同时焊接在PCB表面。本文将从波峰焊的原理、优缺点、应用领域以及未来发展等方面进行介绍。
云恒制造
2023/04/10
1.4K0
Intel先进封装技术:从异构集成到光互连创新
      在2025年IEEE第75届电子元件与技术会议(ECTC)上,英特尔发布了一系列关于先进封装技术的研究成果,涵盖CPO/OIO、嵌入式多芯片互连桥(EMIB)的下一代演进(EMIB-T)、光互联封装集成及高精度热压焊(TCB)等核心领域,构建了从光互联到电互连、从芯片集成到系统级可靠性的完整解决方案:
光芯
2025/07/10
5680
Intel先进封装技术:从异构集成到光互连创新
隐秘的角落:SMT过炉速度不当带来的质量隐患
SMT论坛上有这么一个帖子,大概的问题是锡膏工艺后PCB上的晶振无法起振,排除虚焊、短路问题,在晶振回路区域用洗板水擦洗或者烙铁焊一下之后,晶振即恢复正常,而且问题可双向复现——
硬件大熊
2022/06/23
4630
隐秘的角落:SMT过炉速度不当带来的质量隐患
PCB喷锡板有哪些优缺点?
喷锡板是一种常见类型的PCB板,一般为多层高精密度的PCB板,广泛应用于各类电子设备、通讯产品、计算机、医疗设备、航空航天等领域和产品。
高拓电子
2021/10/21
1.1K0
为什么PCB线路板要把过孔堵上?
导电孔Via hole又名导通孔,为了达到客户要求,线路板导通孔必须塞孔,经过大量的实践,改变传统的铝片塞孔工艺,用白网完成线路板板面阻焊与塞孔。生产稳定,质量可靠。
AI 电堂
2022/12/08
4430
为什么PCB线路板要把过孔堵上?
什么是SMT钢网
本文是一篇全面介绍SMT钢网的文章,在这里,您将了解到SMT钢网的定义、SMT钢网的分类、SMT钢网相关的术语解释、SMT钢网开口设计、制作材料的介绍以及制作方法。
硬件开源小站
2023/04/13
3.7K0
耐用性跟可靠性根本就不是一回事
Bob Neves和某编辑团队探讨论他发现用户正在做的可靠性测试和在实际使用中遇到的情况之间存在脱节,以及为什么现在的大部分可靠性测试都应该被视为耐用性测试。
高拓电子
2022/08/24
4580
印制电路板中常用标准介绍
1) IPC-ESD-2020: 静电放电控制程序开发的联合标准。包括静电放电控制程序所必须的设计、建立、实现和维护。根据某些军事组织和商业组织的历史经验,为静电放电敏感时期进行处理和保护提供指导。
高拓电子
2022/08/12
8340
表面贴装技术(SMT)的优缺点
如果您一直想知道表面贴装技术(SMT)的优势是什么,那么没有必要费力。本文将揭示SMT的最大优点,最后还将列出其缺点。
硬件开源小站
2023/04/24
7420
SMT的优势在哪里
SMT贴片指的是在PCB的基础上进行加工这一系列的工艺流程的简称,SMT是表面组装技术(表面贴装技术)(Surface Mounted Technology的缩写),是电子组装行业里最流行的一种技术和工艺,也是是新兴的工业制造技术和工艺。
高拓电子
2021/10/19
2K0
电路板维修入门教程视频_电路板坏了去哪里维修
电容是由两片金属膜紧靠,中间用绝缘材料隔开而组成的元件。电容的特性主要是隔直流通交流。电容容量的大小就是表示能贮存电能的大小,电容对交流信号的阻碍作用称为容抗,它与交流信号的频率和电容量有关。
全栈程序员站长
2022/09/27
1.8K0
PCBA工艺流程
可能你会说:“我需要的是如何画原理图,分析电路,以及Layout”;但其实产品设计与生产制造等环环相扣,息息相关。
ElectricDeveloper
2022/09/22
6910
PCBA工艺流程
相关推荐
SMT贴片加工的焊点失效的原因您了解吗?
更多 >
LV.5
武汉蔡甸泛式教育
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验