三、排序算法

news2024/9/25 23:13:13

文章目录

  • 一、排序算法的介绍
  • 二、算法的时间复杂度
    • 2.1 基本介绍
    • 2.2 时间频度
    • 2.3 时间复杂度的表示
    • 2.4 算法的平均时间复杂度和最坏时间复杂度
  • 三、算法的空间复杂度
  • 四、排序算法
    • 4.1 交换排序
      • 4.1.1 冒泡排序
      • 4.1.2 快速排序
    • 4.2 选择排序
      • 4.2.1 简单选择排序
      • 4.2.2 堆排序
    • 4.3 插入排序
      • 4.3.1 直接插入排序
      • 4.3.2 折半插入排序(书上补充P238)
      • 4.3.3 希尔排序
  • 五、归并排序
  • 六、基数排序
  • 七、排序算法总结

一、排序算法的介绍

在这里插入图片描述

二、算法的时间复杂度

2.1 基本介绍

在这里插入图片描述

2.2 时间频度

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3 时间复杂度的表示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.4 算法的平均时间复杂度和最坏时间复杂度

在这里插入图片描述

三、算法的空间复杂度

在这里插入图片描述

四、排序算法

4.1 交换排序

4.1.1 冒泡排序

在这里插入图片描述

在这里插入图片描述

package com.gyh.sort;

import java.util.Arrays;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class BubbleSort {
    public static void main(String[] args) {
        int[] nums = {2, 84, 17, 291, 92, 17, 817, 17};
        sort(nums, true);
        Arrays.stream(nums).forEach(System.out::println);
    }

    /**
     * 排序方法
     *
     * @param nums      需要排序的数组
     * @param ascending 是否升序
     */
    private static void sort(int[] nums, boolean ascending) {
        int temp;
        boolean flag; // 标志位判断是否有一次遍历没有交换数据
        // 走几趟
        for (int i = 0; i < nums.length - 1; i++) {
            // 每一趟需要的遍历
            flag = true;
            for (int j = 0; j < nums.length - 1 - i; j++) {
                if (ascending) {
                    if (nums[j] > nums[j + 1]) { // 不添加等号,使排序稳定
                        temp = nums[j];
                        nums[j] = nums[j + 1];
                        nums[j + 1] = temp;
                        if (flag) flag = false;
                    }
                } else {
                    if (nums[j] < nums[j + 1]) { // 不添加等号,使排序稳定
                        temp = nums[j];
                        nums[j] = nums[j + 1];
                        nums[j + 1] = temp;
                        if (flag) flag = false;
                    }
                }
            }
            if (flag) {
                return;
            }
        }
    }

}

4.1.2 快速排序

在这里插入图片描述

在这里插入图片描述

//  以首元素作为中轴值的快排
package com.gyh.sort;

import java.util.Arrays;

/**
 * @author Gao YongHao
 * @version 1.0
 * 以首元素作为中轴值的快排
 */
public class QuickSort2 implements Sort {
    public static void main(String[] args) {
        int[] nums = {2, 1, 17, 291, 92, 17, 817, 17};
        new QuickSort2().sort(nums, false);
        Arrays.stream(nums).forEach(System.out::println);
    }

    @Override
    public void sort(int[] nums, boolean ascending) {
        sort(nums, 0, nums.length - 1, ascending);
    }

    private void sort(int[] nums, int low, int high, boolean ascending) {
        // 设置第一个元素为中轴值(此时low位置被挖空)
        int pivot = nums[low];
        int l = low;
        int h = high;
        while (l < h) {
            //
            while (l < h && (ascending ? nums[h] >= pivot : nums[h] <= pivot)) {
                h--;
            }
            nums[l] = nums[h];

            while (l < h && (ascending ? nums[l] <= pivot : nums[l] >= pivot)) l++;
            nums[h] = nums[l];
        }
        // 此时 l=h 对应位置即为中轴最终位置
        nums[l] = pivot;
        // 分别对左右进行递归
        if (l - 1 > low) {
            sort(nums, low, l - 1, ascending);
        }
        // 此时 l = h
        if (l + 1 < high) {
            sort(nums, l + 1, high, ascending);
        }
    }
}

// 以中间元素作为中轴值的快速排序
package com.gyh.sort;

import java.util.Arrays;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class QuickSort implements Sort {
    public static void main(String[] args) {
        int[] nums = new int[11];
        for (int i = 0; i < nums.length; i++) {
            nums[i] = i + 1;
        }
        nums[1] = 9;
        new QuickSort().sort(nums, true);
        Arrays.stream(nums).forEach(System.out::println);
    }

    @Override
    public void sort(int[] nums, boolean ascending) {
        sort(nums, 0, nums.length - 1, ascending);
    }

    private void sort(int[] nums, int left, int right, boolean ascending) {
        int l = left;
        int r = right;
        int temp;
        // pivot 中轴值
        int pivot = nums[(left + right) / 2];
        while (l < r) {
            // 在pivot的左边一直找,找到大于等于pivot值,才退出
            // 存在情况是没有大于等于的元素
            while (ascending ? nums[l] < pivot : nums[l] > pivot) {
                l++;
            }

            // 在pivot的右边一直找,找到小于等于pivot值,才退出
            // 存在情况是没有大于等于的元素
            while (ascending ? nums[r] > pivot : nums[r] < pivot) {
                r--;
            }

            // 如果 l >= r 说明 pivot 的左右两边的值,已经按照左边全部小于等于 pivot
            // 右边全部大于于等于 pivot 分布
            if (l >= r) {
                break;
            }

            // 交换搜索到的 l 与 r 的值
            temp = nums[l];
            nums[l] = nums[r];
            nums[r] = temp;


            if (nums[l] == pivot) {
                r--;
            }
            if (nums[r] == pivot) {
                l++;
            }
        }
        if (l == r) {
            l += 1;
            r -= 1;
        }
        if (left < r) {
            sort(nums, left, r, ascending);// 左边
        }
        if (right > l) {
            sort(nums, l, right, ascending);// 右边
        }

    }
}

4.2 选择排序

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.2.1 简单选择排序

在这里插入图片描述

package com.gyh.sort;

import java.util.Arrays;

/**
 * @author Gao YongHao
 * @version 1.0
 * 简单快速排序
 */
public class SimpleSelectSort implements Sort {
    public static void main(String[] args) {
        int[] nums = {101, 34, 119, 1};
        new SimpleSelectSort().sort(nums, false);
        Arrays.stream(nums).forEach(System.out::println);
    }


    @Override
    public void sort(int[] nums, boolean ascending) {
        int index;
        int temp;
        // 走几轮
        for (int i = 0; i < nums.length - 1; i++) {
            // 升序排法
            index = i;
            for (int j = i + 1; j < nums.length; j++) {
                if (ascending) {
                    if (nums[j] < nums[index]) {
                        index = j;
                    }
                } else {
                    if (nums[j] > nums[index]) {
                        index = j;
                    }
                }
            }
            if (index != i) {// 若就是本位则无需交换
                temp = nums[index];
                nums[index] = nums[i];
                nums[i] = temp;
            }
        }
    }
}

4.2.2 堆排序

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

package com.gyh.sort;

import java.util.Arrays;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class HeapSort implements Sort {
    public static void main(String[] args) {
        int[] nums = {2, 1, 17, 291, 92, 17, 817, 17};
        new HeapSort().sort(nums, true);
        Arrays.stream(nums).forEach(System.out::println);
    }

    @Override
    public void sort(int[] nums, boolean ascending) {
        if (nums == null || nums.length <= 1) {
            return;
        }
        // 初始化堆
        createHeap(nums, ascending);

        int temp;
        for (int i = nums.length - 1; i > 0; i--) {
            // 将堆顶元素与最后位置元素交换
            temp = nums[i];
            nums[i] = nums[0];
            nums[0] = temp;
            // 从第一层堆顶再次调整堆
            heapAdjust(nums, 0, i - 1, ascending);
        }
    }

    /**
     * 作为完全二叉树的排序算法,最后一个非叶子结点的数组下标为 arr.length/2 - 1
     * 从该位置依次向前进行向上的筛选
     *
     * @param arr       待排序数组
     * @param ascending 是否升序
     */
    private void createHeap(int[] arr, boolean ascending) {
        if (arr == null || arr.length <= 0) {
            return;
        }
        int n = arr.length / 2 - 1;
        // 从最后一个非叶子结点依次向堆顶进行筛选
        for (int i = n; i >= 0; i--) {
            heapAdjust(arr, i, arr.length - 1, ascending);
        }
    }


    /**
     * 使用筛选法调整堆(以堆为前提,至上而下的调整)
     *
     * @param arr       待调整数组
     * @param org       待筛选的堆顶
     * @param dis       数组的最后的元素下标(对应最后一个堆的位置)
     * @param ascending 是否升序
     */
    private void heapAdjust(int[] arr, int org, int dis, boolean ascending) {
        // 假设[org+1,dis]均为堆,现将[org,dis]调整为堆

        // 依次向下进行筛选(仅筛选与根节点交换的子树是否是堆)
        // 对于初始化堆:最先对其最后一个非终端结点的左子树根节点与右子树根节点进行比较
        int r = arr[org]; // 先保存根元素
        for (int i = 2 * org + 1; i <= dis; i = i * 2 + 1) {
            // i < dis 保证了初始化堆中的最后一个非终端结点存在左结点与右结点
            // 若 i == dis 则仅存在左结点
            // 筛选出子节点中最大(小)元素对应的下标
            if (i < dis && (ascending ? arr[i] < arr[i + 1] : arr[i] > arr[i + 1])) i++;

            // 已满足堆,则退出(r应该插入当前结点的双亲结点)
            if (ascending ? r >= arr[i] : r <= arr[i]) break;

            arr[org] = arr[i]; // 最值赋给堆顶
            org = i; // 重置新的堆顶位置
        }

        // 将最后的堆的堆顶设置为初始待调整的值
        arr[org] = r;

    }
}

4.3 插入排序

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.3.1 直接插入排序

在这里插入图片描述

在这里插入图片描述

package com.gyh.sort;

import java.util.Arrays;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class DirectInsetSort implements Sort {
    public static void main(String[] args) {
        int[] nums = {2, 1, 17, 291, 92, 17, 817, 17};
        new DirectInsetSort().sort(nums, false);
        Arrays.stream(nums).forEach(System.out::println);
    }

    @Override
    public void sort(int[] nums, boolean ascending) {
        int insetIndex;
        int insertValue;

        // 前 i 个元素组成有序表,后 nums.length - i 个元素组成无序表
        for (int i = 1; i < nums.length; i++) {
            insetIndex = i - 1; // 保存无序表首元素的前一个位置
            insertValue = nums[i];
            // 条件一:限定数据边界
            // 条件二:设置升(降)序的判断
            while (insetIndex >= 0 && (ascending ? nums[insetIndex] > insertValue : nums[insetIndex] < insertValue)) {
                nums[insetIndex + 1] = nums[insetIndex]; // 数组元素移动位置(前一元素覆盖后一元素)
                insetIndex--;
            }
            // 判断是否需要赋值
            if (insetIndex + 1 != i) {
                nums[insetIndex + 1] = insertValue;
            }

        }
    }
}

4.3.2 折半插入排序(书上补充P238)

package com.gyh.sort;

import java.util.Arrays;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class BinaryInsertSort implements Sort {
    public static void main(String[] args) {
        int[] nums = {2, 1, 17, 291, 92, 17, 817, 17};
        new BinaryInsertSort().sort(nums, false);
        Arrays.stream(nums).forEach(System.out::println);
    }

    @Override
    public void sort(int[] nums, boolean ascending) {
        int low, high, mid;
        int temp;
        // 从第二个位置开始
        for (int i = 1; i < nums.length; i++) {
            low = 0;
            high = i - 1;
            while (low <= high) {
                mid = (low + high) / 2; // 中间元素的位置
                if (ascending ? nums[mid] > nums[i] : nums[mid] < nums[i]) { // 不加等号保证稳定
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            // 待插入位置位于high之后一个位置
            // 特殊的如果待插入元素比有序表的尾元素还大(小)则不会进行后移操作
            temp = nums[i];
            for (int j = i - 1; j >= high + 1; j--) {
                nums[j + 1] = nums[j];
            }
            nums[high + 1] = temp;

        }
    }
}

4.3.3 希尔排序

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

// 交换法(慢)
package com.gyh.sort;

import java.util.Arrays;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class ShellSort implements Sort {
    public static void main(String[] args) {
        int[] nums = {2, 1, 17, 291, 92, 17, 817, 17, 3};
        new ShellSort().sort(nums, false);
        /**
         * 希尔排序第1轮 =[92, 17, 817, 291, 3, 1, 17, 17, 2]
         * 希尔排序第2轮 =[817, 291, 92, 17, 17, 17, 3, 1, 2]
         * 希尔排序第3轮 =[817, 291, 92, 17, 17, 17, 3, 2, 1]
         */
        Arrays.stream(nums).forEach(System.out::println);
    }


    @Override
    public void sort(int[] nums, boolean ascending) {
        int temp;
        int count = 0;
        for (int gap = nums.length / 2; gap > 0; gap /= 2) {
            for (int i = gap; i < nums.length; i++) {
                // 遍历各组中所有的元素(共gap组),步长为 gap
                for (int j = i - gap; j >= 0; j -= gap) {
                    if (ascending ? nums[j] > nums[j + gap] : nums[j] < nums[j + gap]) {
                        temp = nums[j];
                        nums[j] = nums[j + gap];
                        nums[j + gap] = temp;
                    }
                }
            }
            System.out.println("希尔排序第" + (++count) + "轮 =" + Arrays.toString(nums));


        }
    }
}

// 移位法(快)
package com.gyh.sort;

import java.util.Arrays;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class ShellSort2 implements Sort {
    public static void main(String[] args) {
        int[] nums = {2, 1, 17, 291, 92, 17, 817, 17};
        new ShellSort2().sort(nums, false);
        Arrays.stream(nums).forEach(System.out::println);
    }

    @Override
    public void sort(int[] nums, boolean ascending) {
        int count = 0;
        for (int gap = nums.length / 2; gap > 0; gap /= 2) {
            // i是无序序列的第一个元素
            for (int i = gap; i < nums.length; i++) {
                int insetIndex = i - gap; // 同一组的前一个元素
                int insertValue = nums[i];
                while (insetIndex >= 0 && (ascending ? nums[insetIndex] > insertValue : nums[insetIndex] < insertValue)) {
                    nums[insetIndex + gap] = nums[insetIndex];// 同组前一元素覆盖后一元素
                    insetIndex -= gap;
                }
                nums[insetIndex + gap] = insertValue;
            }
            System.out.println("希尔排序第" + (++count) + "轮 =" + Arrays.toString(nums));
        }
    }
}

五、归并排序

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

package com.gyh.sort;

import java.util.Arrays;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class MergingSort implements Sort {

    public static void main(String[] args) {
        int[] nums = {8, 4, 5, 7, 1, 3, 6, 2,9};
        new MergingSort().sort(nums, true);
        Arrays.stream(nums).forEach(System.out::println);
    }

    @Override
    public void sort(int[] nums, boolean ascending) {
        mergeSort(nums, 0, nums.length - 1, new int[nums.length], ascending);
    }

    private void mergeSort(int[] nums, int left, int right, int[] temp, boolean ascending) {
        int mid;
        if (left < right) {
            mid = (left + right) / 2;
            mergeSort(nums, left, mid, temp, ascending); // 归并左边
            mergeSort(nums, mid + 1, right, temp, ascending); // 归并右边
            merge(nums, left, mid, right, temp, ascending); // 合并当前
        }
    }

    private void merge(int[] nums, int left, int mid, int right, int[] temp, boolean ascending) {
        // 左、右边有序表的位置指针初始化
        int l = left;
        int r = mid + 1;
        int cur = 0;
        while (l <= mid && r <= right) {
            if (ascending ? nums[l] <= nums[r] : nums[l] >= nums[r]) { // 等号实现稳定
                temp[cur++] = nums[l++];
            } else {
                temp[cur++] = nums[r++];
            }
        }

        // 把剩余一边的有序序列依次填充至temp
        while (l <= mid) temp[cur++] = nums[l++];
        while (r <= right) temp[cur++] = nums[r++];

        // 将中间结果保存至原数组
        int tempLeft = left;
        cur = 0;
        while (tempLeft <= right) {
            nums[tempLeft++] = temp[cur++];
        }
    }
}

六、基数排序

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

package com.gyh.sort;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class RadixSorting implements Sort {
    public static void main(String[] args) {
        int[] nums = {2, 84, 17, 291, 92, 17, 817, 17};
        new RadixSorting().sort(nums, false);
        Arrays.stream(nums).forEach(System.out::println);
    }

    @Override
    public void sort(int[] nums, boolean ascending) {
        // 找到最大值(确定关键字(d)的个数)
        int max = nums[0];
        for (int num : nums) {
            if (num > max) {
                max = num;
            }
        }
        // 计算关键字个数(位数)
        int maxLength = (max + "").length();

        // 使用(链表)队列的基数排序(桶的个数有各关键字的取值范围决定)
        // 本例中 关键字是:位数  各位数上的范围是:0-9
        ArrayList<LinkedQueue<Integer>> bucket = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            bucket.add(new LinkedQueue<>());
        }
        int cur;
        for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
            // 先分配
            for (int num : nums) {
                // 取出指定位上的元素值
                int digitOfElement = num / n % 10;
                bucket.get(digitOfElement).push(num);
            }

            // 再收集
            cur = 0;
            // 升序(正向收集)
            // 降序(反向收集)
            for (int j = 0; j < bucket.size(); j++) {
                LinkedQueue<Integer> integerLinkedQueue = bucket.get(ascending ? j : bucket.size() - j - 1);
                while (integerLinkedQueue.size() > 0) {
                    nums[cur++] = integerLinkedQueue.pop();
                }
            }

        }


    }


}


class LinkedQueue<T> {
    // 设置头结点
    private final Node<T> head;
    // 设置队尾元素指针
    private Node<T> rear;

    private int size = 0;

    public int size() {
        return size;
    }

    public LinkedQueue() {
        // 起始位置头尾指针均指向头结点
        rear = new Node<>(null, null);
        head = rear;
    }

    public boolean isEmpty() {
        return head.next == null;
    }

    public void push(T d) {
        rear.next = new Node<>(d, rear.next);
        rear = rear.next;
        size++;
    }

    public T pop() {
        if (isEmpty()) {
            throw new RuntimeException("没有元素");
        }

        T d = head.next.data;
        // 如果删除的是最后一个元素,则重置rear
        if (rear == head.next) {
            rear = head;
        }

        head.next = head.next.next;
        size--;
        return d;
    }

}

class Node<T> {
    T data;
    Node<T> next;

    public Node(T data, Node<T> next) {
        this.data = data;
        this.next = next;
    }
}

七、排序算法总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2121281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Llama 3的最强开源医疗AI模型发布,刷新榜单

转自&#xff1a;火星AIGC 一家名为Saama AI Labs发布了他们基于Llama 3 微调的开源医疗AI大模型OpenBioLLM-Llama3-70B 和 OpenBioLLM-Llama3-8B&#xff0c;刷新抱抱脸上的医疗大模型榜单&#xff0c;并占据榜首。其在生物医学领域的测试性能超越 GPT-4、Gemini、Meditron-7…

浙大数据结构:04-树6 Complete Binary Search Tree

这道题利用了完全二叉树的性质&#xff0c;我也参考了一些代码写的。 &#xff08;自己一开始写了别的方法&#xff0c;但一直过不了最后一个测试点&#xff0c;红温了&#xff09; 机翻&#xff1a; 1、条件准备 用vector存输入的数据&#xff0c;另一个数组存输出的结果&a…

文心一言 VS 讯飞星火 VS chatgpt (344)-- 算法导论23.2 3题

三、对于稀疏图 G ( V &#xff0c; E ) G(V&#xff0c;E) G(V&#xff0c;E)&#xff0c;这里 ∣ E ∣ Θ ( V ) |E|Θ(V) ∣E∣Θ(V)&#xff0c;使用斐波那契堆实现的Prim算法是否比使用二叉堆实现的算法更快&#xff1f;对于稠密图又如何呢&#xff1f; ∣ E ∣ |E| ∣E…

FPGA技术赋能云数据中心:提高性能与效率

随着现代科技的迅猛发展和大数据时代的推动&#xff0c;云数据中心已成为众多企业的核心基础设施。然而&#xff0c;伴随数据处理需求的不断增长&#xff0c;传统硬件架构在性能、功耗和灵活性方面面临诸多挑战。为了解决这些问题&#xff0c;FPGA&#xff08;现场可编程门阵列…

辽宁汇聚公益慈善力量,绿葆网络助力辽宁绿色生态建设,彰显企业大爱

9月5日&#xff0c;于辽宁省沈阳市隆重举行的“中华慈善日”主题宣传活动暨“山海有情 天辽地宁”即开型福利彩票发行、“生态公益林”项目启动仪式上&#xff0c;广州绿葆网络发展有限公司作为受邀企业之一&#xff0c;积极履行社会责任&#xff0c;向辽宁省慈善联合总会捐赠了…

坐牢第三十六天(QT)

自定义QQ界面 wedget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> //qt中信息调试类 #include <QIcon> //图标类 #include <QPushButton>//按钮类 #include <QLabel> //标签类 #include <QMovie> //动图类…

【C++】—— vector 的模拟实现

【C】—— vector 的模拟实现 0 前言1 vector 的成员变量1.1 stl 库中的 vector 成员变量1.2 模拟实现 vector 成员变量 2 迭代器3 size、capacity、empty4 opreator[ ]5 reserve5.1 初版 reserve5.2 _finish 的处理5.3 深拷贝5.4 终版 6 push_back 与 pop_back7 打印函数7.1 初…

打破界限,自闭症寄宿学校带给孩子的改变

在社会的广阔画卷中&#xff0c;有一群特别的孩子&#xff0c;他们以独特的视角感知世界&#xff0c;以非凡的方式表达情感&#xff0c;他们就是自闭症儿童。自闭症&#xff0c;这个听起来略带神秘色彩的词汇&#xff0c;实则承载着无数家庭的期盼与挑战。在这片充满爱的土地上…

【北京迅为】《STM32MP157开发板使用手册》-第十六章 Buildroot制作根文件系统

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

丰巢“闯关”港交所上市

社区中随处可见的智能快递柜&#xff0c;即将捧出一个IPO。 近日&#xff0c;丰巢控股有限公司&#xff08;下称“丰巢控股”或“丰巢”&#xff09;正式向港交所递交了招股书&#xff0c;华泰国际担任其独家保荐人。这将是继顺丰控股、顺丰房托、嘉里物流、顺丰同城之后&…

【Qt笔记】QGroupBox控件详解

目录 引言 一、基本属性 二、常用方法 2.1 构造函数 2.2 设置标题 2.3 设置复选框模式 2.4 是否被选中 2.5 设置对齐方式 2.6 设置扁平化样式 三、信号与槽机制 四、样式定制 五、应用示例 5.1 代码 5.2 代码解析 5.3 实现效果 结语 引言 QGroupBox 是 Qt…

检查iOS多语系文件内容检查iOS多语系文件内容

在iOS中&#xff0c;检查多语言文件&#xff08;如 .strings 文件&#xff09;内容的命令通常使用 plutil 工具。你可以通过终端执行以下命令来检查 .strings 文件的格式和内容&#xff1a; plutil -lint path/to/your/Localizable.strings 这个命令会验证指定的 .strings 文…

C语言13--结构体

结构体基本概念 C语言提供了众多的基本类型&#xff0c;但现实生活中的对象一般都不是单纯的整型、浮点型或字符串&#xff0c;而是这些基本类型的综合体。比如一个学生&#xff0c;典型地应该拥有学号&#xff08;整型&#xff09;、姓名&#xff08;字符串&#xff09;、分数…

已配置好的Linux CentOS7虚拟机转换为可视化界面问题

一、发现问题 学习过程中发现可视化界面比较有意思&#xff0c;就想尝试搞一下看看&#xff0c;于是去网站上搜索&#xff0c;看到的一些是在新建虚拟机的时候进行设置的&#xff0c;我尝试跟着步骤去搞&#xff0c;发现其中最关键的一步&#xff0c;软件选择中&#xff0c;没有…

【北京迅为】《STM32MP157开发板使用手册》- 第十五章 制作最小linux系统

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

TikTok内容电商:短视频与直播带货如何重塑消费者购物决策

数字化时代&#xff0c;内容电商已经成为一种重要的商业模式。而TikTok作为全球领先的短视频平台&#xff0c;其内容电商模式正慢慢改变用户的消费习惯。TikTok Shop作为TikTok平台上的电商板块&#xff0c;也凭借其独特的短视频和直播带货模式&#xff0c;影响着消费者的购物决…

百度MEG数据开发治理平台-TDS

导读 百度MEG的上一代大数据产品存在平台分散、质量不均和易用性差等问题&#xff0c;导致开发效率低下、学习成本高&#xff0c;业务需求响应迟缓。为了解决这些问题&#xff0c;百度MEG内部开发了图灵3.0生态系统。图灵3.0覆盖了数据全生命周期&#xff0c;包括Turing Data …

AI在医学领域:HMARL首个多器官诊断AI框架

多器官疾病因其对多个器官系统的同时影响而带来了显著的挑战&#xff0c;这需要复杂和适应性的治疗策略。尽管在人工智能驱动的医疗决策支持系统方面取得了最新进展&#xff0c;但现有的解决方案通常限于单个器官系统。它们往往忽视了器官系统之间复杂的相互依赖性&#xff0c;…

搜维尔科技:SenseGlove触觉反馈数据手套为人形机器人遥操作提供精确的控制和交互方案

SenseGlove触觉反馈数据手套 使用市场上唯一一款结合力反馈、振动触觉反馈和运动捕捉以及紧凑无线设计的触觉手套来收集数据。 遥操作机器人 远程机器人向人类提供触觉反馈&#xff0c;提供更强的真实感和更高的性能&#xff0c;以及安全性和控制力。远程机器人的 SenseGlov…

适用于BLE室内定位系统的自适应路径损耗模型

自适应路径损耗模型(ADAM):提升BLE室内定位精度的创新方法 室内定位系统(IPS)在物联网、智慧城市等领域中扮演着至关重要的角色。然而,由于室内环境的复杂性(如信号多径效应、障碍物等),传统的定位方法往往面临精度不足的问题。本文介绍了一种新颖的模型——ADAM(Ad…