十大排序算法详解

news2025/1/11 3:58:34

目录

1. 冒泡排序

a. 思路

b. code

2. 插入排序

a. 思路

b. code

3. 希尔排序【插入排序plus】

a. 思路

b. code

4. 选择排序

a. 思路

b. code

5. 基数排序

a. 前置知识

b. 思路

c. code

6. 计数排序

a. 思路

b. code

7. 桶排序(计数排序plus & 基于分治)

a. 思路

b. code

8. 归并(基于分治)

a. 思路

b. code

9. 快排(基于分治)

a. 思路

b. code

10. 堆排序(以大顶堆为例)

a. 前置知识

b. 思路

c. code

11. 测试代码


1. 冒泡排序

a. 思路

  1. 外层循环控制次数,用来一次确定 len - 1, len - 2,len - 3, ... ,0 位置的数
  2. 内层循环遍历的过程中比较相邻两个数,将较大的数放置到数组右边

b. code

void bubble_sort(int arr[]) {
    for (int i = 0; i < len; i++) {
        for (int j = 0; j < len - i - 1; j ++) {
            if (arr[j + 1] < arr[j]) {
				swap(arr, j, j + 1);
            }
        }
    }
}
package bubble_sort;

public class Main {
    /**
     * @description: 冒泡排序
     * @param arr
     * @return void
     * @date: 2023/7/17 20:25
     */
    private static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - i - 1; j ++) {
                // 比较相邻两个数的大小,将较大的数移动到右边
                if (arr[j + 1] < arr[j]) {
                    swap(arr, j, j + 1);
                }
            }
        }
    }
}

2. 插入排序

a. 思路

  1. 默认第一个数有序
  2. 从 index = 1 开始遍历数组,将第 i 个数倒序同之前的数进行比较并插入使得前 i + 1 项有序

b. code

void insert_sort(int arr[]) {
    for (int i = 1; i < len; i ++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j --;
        }
        arr[j + 1] = key;
    }
}
package insert_sort;

public class Main {
    /**
     * @description: 插入排序
     * @param arr
     * @return void
     * @date: 2023/7/17 23:21
     */
      private static void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i ++) {
            int key = arr[i];
            int j = i - 1;
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j --;
            }
            arr[j + 1] = key;
        }
    }
}

3. 希尔排序【插入排序plus】

a. 思路

  1. 设置循环增量 gap,迭代 gap /= 2
  2. 每次循环对 【i,i + gap,i + 2 * gap...】(i in [0,gap]进行插入排序

b. code

void shell_sort(int arr[]) {
    // 初始增量 len / 2, 每次循环后, 增量 /= 2
    for (int gap = len / 2; gap > 0; gap /= 2) {
        // 每次采用插入排序
        for (int i = gap, j; i < len; i ++) {
            int key = arr[i];
            for (j = i; j >= gap && key < arr[j - gap]; j -= gap) {
                arr[j] = arr[j - gap];
            }
            arr[j] = key;
        }
    }
}
package shell_sort;

public class Main {
    /**
     * @description: 希尔排序
     * @param arr
     * @return void
     * @date: 2023/7/24 2:20
     */
    private static void shellSort(int[] arr) {
        // 初始增量 len / 2, 每次循环后, 增量 /= 2
        for (int gap = arr.length / 2; gap > 0; gap /= 2) {
            // 每次采用插入排序
            for (int i = gap, j; i < arr.length; i ++) {
                int key = arr[i];
                for (j = i; j >= gap && key < arr[j - gap]; j -= gap) {
                    arr[j] = arr[j - gap];
                }
                arr[j] = key;
            }
        }
    }
    
}

4. 选择排序

a. 思路

  1. 外层循环控制当前排序的位置
  2. 内层循环遍历 i + 1 ~ j,查找arr在 i ~ j 上的最小数的索引
  3. 然后将查找到的最小的数与 arr[i] 交换顺序

b. code

void select_sort(int arr[]) {
	for (int i = 0; i < len; i++) {
		int minIndex = i;
		for (int j = i + 1; j < len; j ++) {
			if (arr[j] < arr[minIndex])
				minIndex = j;
		}
		swap(arr, i, minIndex);
	}
}
package select_sort;

public class Main {
    /**
     * @description: 选择排序
     * @param arr
     * @return void
     * @date: 2023/7/20 16:17
     */
    private static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j ++) {
                if (arr[j] < arr[minIndex])
                    minIndex = j;
            }
            swap(arr, i, minIndex);
        }
    }
}

5. 基数排序

a. 前置知识

队列:Queue| ProcessOn免费在线作图,在线流程图,在线思维导图

b. 思路

  1. 依次按照数组中数的个位、十位……将数放置到不同的桶中(分类)
  2. 将桶中的数赋值回原数组,作为该轮排序后的顺序(收集)

【PS】 : 每次排序都是基于上一轮的排序后的顺序进行,从而确保顺序不会错乱

c. code

#include <queue>

// 获取个位数(index = 0), 十位数(index = 1)...上的数
int get_num(int num, int lastIndex);
// 获取最大数的长度, 作为数组的分类次数
int get_cnt(int arr[]);
// 基数排序 
void radix_sort(int arr[]);


void radix_sort(int arr[]) {
    // 1. 找最大值的长度, 确定循环轮次
    int cnt = get_cnt(arr);

    // 2. 初始化十个桶
    queue<int> q[10];

    // 3.依次按照个位、十位数进行排序
    for (int i = 0; i < cnt; i++) {
        // 3.1 分类过程: 将数按照位数放入相应的桶中
        for (int j = 0; j < len; j ++) {
            q[get_num(arr[j], i)].push(arr[j]);
        }
        // 3.2 收集过程: 将桶中的数依次放入原数组 arr 中
        for (int j = 0, index = 0; j < 10; j ++) {
            while (!q[j].empty()) {
                arr[index ++] = q[j].front();
                q[j].pop();
            }
        }
    }
}

int get_num(int num, int lastIndex) {
	int res = num;
	for (int i = 0; i < lastIndex; i ++) {
		res /= 10;
	}
	return res % 10;
}

int get_cnt(int arr[]) {
	int max = arr[0]; 
	for (int i = 1; i < len; i ++) {
		if (arr[i] > max) {
			max = arr[i];
		}
	}
	int cnt = 0; 
	while (max > 0) {
		max /= 10;
		cnt ++;
	}
    return cnt;
}
package radix_sort;

import java.util.LinkedList;

public class Main {
    /**
     * @description: 基数排序
     * @param arr
     * @return void
     * @date: 2023/7/22 9:56
     */
    private static void radixSort(int[] arr) {
        // 1. 找最大值的长度, 确定循环轮次
        int cnt = getCnt(arr);

        // 2. 初始化十个桶
        LinkedList<Integer>[] list = new LinkedList[10];
        for (int i = 0; i < list.length; i++) {
            list[i] = new LinkedList<>();
        }

        // 3.依次按照个位、十位数进行排序
        for (int i = 0; i < cnt; i++) {
            // 3.1 分类过程: 将数按照位数放入相应的桶中
            for (int j = 0; j < arr.length; j ++) {
                list[getNum(arr[j], i)].offer(arr[j]);
            }
            // 3.2 收集过程: 将桶中的数依次放入原数组 arr 中
            for (int j = 0, index = 0; j < list.length; j ++) {
                while (!list[j].isEmpty()) {
                    arr[index ++] = list[j].poll();
                }
            }
        }
    }
    
    // 获取个位数(index = 0), 十位数(index = 1)...上的数
    private static int getNum(Integer num, int lastIndex) {
        return num.toString().length() <= lastIndex ? 0 : num.toString().charAt(num.toString().length() - lastIndex - 1) - '0';
    }

    // 获取最大数的长度, 作为数组的分类次数
    private static int getCnt(int[] arr) {
        return (Arrays.stream(arr).max().getAsInt() + "").length();
    }
}

6. 计数排序

a. 思路

  1. 构建临时数组,对 arr 中的数进行次数统计(计数)
  2. 按照统计好的结果给 arr 赋值

b. code

void cnt_sort(int arr[]) {
    // 1. 获取最大值、最小值
    int max = arr[0], min = arr[0];
    for (int i = 1; i < len; i ++) {
    	if (arr[i] > max) {
    		max = arr[i];
		} 
		if (arr[i] < min) {
			min = arr[i];
		}
	}
    
    // 2. 创建临时数组
    int temp_arr[max - min + 1];
    for (int i = 0; i < max - min + 1; i ++) {
        temp_arr[i] = 0;
    }

    // 3. 对 arr 进行计数
    for (int i = 0; i < len; i ++) {
        temp_arr[arr[i] - min] ++;
    }

    // 4. 按照统计结果将数赋值给原始数组 arr
    for (int i = 0, index = 0; i < max - min + 1; i ++) {
        while (temp_arr[i] -- > 0) {
            arr[index ++] = i + min;
        }
    }
}
package count_sort;

import java.util.Arrays;

public class Main {
    /**
     * @description: 计数排序
     * @param arr
     * @return void
     * @date: 2023/7/23 19:28
     */
    private static void cntSort(int[] arr) {
        // 1. 获取最大值、最小值
        int max = Arrays.stream(arr).max().getAsInt();
        int min = Arrays.stream(arr).min().getAsInt();
        
        // 2. 创建临时数组
        int[] tempArr = new int[max - min + 1];

        // 3. 对 arr 进行计数
        for (int i = 0; i < arr.length; i ++) {
            tempArr[arr[i] - min] ++;
        }

        // 4. 按照统计结果将数赋值给原始数组 arr
        for (int i = 0, index = 0; i < tempArr.length; i ++) {
            while (tempArr[i] -- > 0) {
                arr[index++] = i + min;
            }
        }
    }

}

7. 桶排序(计数排序plus & 基于分治)

a. 思路

  1. 划分为多个范围相同的区间,每个区间自排序(递归 or 调用别的排序算法)
  2. 将区间合并

【PS】:计数排序可以看成每个桶只存储相同元素,而桶排序每个桶存储一定范围的元素

b. code

#include <vector>
#include<algorithm>

void bucket_sort(int arr[]){
    // 1. 获取最大值、最小值
    int max = arr[0], min = arr[0];
    for (int i = 1; i < len; i ++) {
    	if (arr[i] > max) {
    		max = arr[i];
		} 
		if (arr[i] < min) {
			min = arr[i];
		}
	}
    // 2. 计算桶的数量并初始化桶集合 
    int bucketCnt = (max - min) / len + 1;
    vector<vector<int>> bucketList(bucketCnt);

    // 3. 将每个元素放入桶
    for (int i = 0; i < len; i ++) {
    	bucketList[(arr[i] - min) / len].push_back(arr[i]);
	}

    // 4. 对每个桶进行排序
    for (int i = 0; i < bucketList.size(); i ++) {
    	sort(bucketList[i].begin(), bucketList[i].end());
	}

    // 5. 将桶中的元素赋值到原序列
    for (int i = 0, index = 0; i < bucketCnt; i ++) {
    	for (int j = 0; j < bucketList[i].size(); j ++) {
    		arr[index ++] = bucketList[i][j];
		}
	}
}
package bucket_sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    /**
     * @description: 桶排序
     * @param arr
     * @return void
     * @date: 2023/7/24 0:48
     */
    public static void bucketSort(int[] arr){
        // 1. 计算最大值、最小值
        int max = Arrays.stream(arr).max().getAsInt();
        int min = Arrays.stream(arr).min().getAsInt();

        // 2. 计算桶的数量并初始化桶
        int bucketCnt = (max - min) / arr.length + 1;
        List<ArrayList<Integer>> bucketList = new ArrayList<ArrayList<Integer>>(){{
            for(int i = 0; i < bucketCnt; i++){
                add(new ArrayList<>());
            }
        }};

        // 3. 将每个元素放入桶
        Arrays.stream(arr).forEach(i -> bucketList.get((i - min) / arr.length).add(i));

        // 4. 对每个桶进行排序
        bucketList.forEach(Collections::sort);

        // 5. 将桶中的元素赋值到原序列
        AtomicInteger index = new AtomicInteger();
        bucketList.forEach(bucket -> bucket.forEach(i -> arr[index.getAndIncrement()] = i));
    }
}

8. 归并(基于分治)

a. 思路

  1. 确定分界点:mid =(l + r)/ 2
  2. 递归排序 left & right
  3. 归并,合二为一

【PS】:先递归处理,后合二为一

b. code

// 归并用的合并辅助数组 
int temp_arr[N];

// 归并排序 
void merge_sort(int arr[], int l, int r) {
	if (l >= r) {
		return;
	}

    // 递归
	int mid = l + ((r - l) >> 1);
	merge_sort(arr, l, mid);
	merge_sort(arr, mid + 1, r);

    // 合并
	int index = l, i = l, j = mid + 1;
	while (i <= mid && j <= r) {
		temp_arr[index ++] = arr[i] < arr[j] ? arr[i ++] : arr[j ++];
	} 
	while (i <= mid) temp_arr[index ++] = arr[i ++];
	while (j <= r) temp_arr[index ++] = arr[j ++];

    // 从排好序的数从临时数组放入到原数组
	for (int temp_index = l; temp_index <= r; temp_index ++) {
		arr[temp_index] = temp_arr[temp_index];
	}
	 
}
package merge_sort;

public class Main {
    
    private static int[] tempArr = new int[MAX_LEN];

    /**
     * @description: 归并排序
     * @param arr
     * @param l 左边界
     * @param r 右边界
     * @return void
     * @date: 2023/6/6 10:57
     */
    private static void mergeSort(int[] arr, int l, int r) {
        if (l >= r) {
            return;
        }

        int mid = l + ((r - l) >> 1);

        mergeSort(arr, l, mid);
        mergeSort(arr, mid + 1, r);

        int index = l, i = l, j = mid + 1;
        while (i <= mid && j <= r) {
            tempArr[index ++] = arr[i] <= arr[j] ? arr[i ++] : arr[j ++];
        }

        while (i <= mid) tempArr[index ++] = arr[i ++];
        while (j <= r) tempArr[index ++] = arr[j ++];

        for (int tempIndex = l; tempIndex <= r; tempIndex ++) {
            arr[tempIndex] = tempArr[tempIndex];
        }
    }
}

9. 快排(基于分治)

a. 思路

  1. 确定基准点 x = arr[l] or arr[(l + r) / 2] or arr[r] or 随机)
  2. 调整区间为:左边 <= 基准 x,右边 >= 基准 x
  3. 递归处理左右两段

【PS】:先划分边界,后递归处理

b. code

void quick_sort(int arr[], int l, int r) { 
	if (l >= r) {
		return;
	}
	
	// i, j 指向 l, r 的两侧, 因为 while 那儿使用 ++i 这种格式 
	int x = arr[l], i = l - 1, j = r + 1;

	while (i < j) {
        // 找左右两侧需要需要交换位置的点
		while (arr[++ i] < x);
		while (arr[-- j] > x);
        
        // 交换位置
		if (i < j)  swap(arr, i, j);
	} 
	
	// 递归: 这儿按 j 来写, 避免出现边界问题 
	quick_sort(arr, l, j);
	quick_sort(arr, j + 1, r);
}
package quick_sort;

public class Main {
    
    /**
     * @description: 快排
     * @param arr 排序数组
     * @param l 左边界
     * @param r 右边界
     * @return void
     * @date: 2023/6/6 4:54
     */
    private static void quickSort(int[] arr, int l, int r) {
        if (l >= r) {
            return;
        }

        int x = arr[l], i = l - 1, j = r + 1;

        while (i < j) {
            while (arr[++ i] < x);
            while (arr[-- j] > x);

            if (i < j) swap(arr, i, j);
        }

        quickSort(arr, l, j);
        quickSort(arr, j + 1, r);

    }

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

10. 堆排序(以大顶堆为例)

a. 前置知识

大顶堆:父节点 > 左孩子 && 父节点 > 右孩子

b. 思路

  1. 基于原数组初始化大顶堆
  2. 将大顶堆的堆首堆尾交换位置,从而使堆尾之后的子数组有序
  3. 将堆的大小 - 1(1:刚刚交换的堆顶数,位置已确定),重新维护新的大顶堆

c. code

void heap_sort(int arr[]) {
    // 1. 构建大顶堆(从第一个有孩子节点的地方开始维护)
    for (int i = len / 2 - 1; i >= 0; -- i) {
        heapify(arr, i, len);
    }

    // 2. 排序
    for (int i = len - 1; i >= 1; -- i) {
        // 把大顶堆的堆顶元素与最后一个元素交换
        swap(arr, 0, i);
        // 对打乱的堆进行调整,恢复堆的特性
        heapify(arr, 0, i);
    }
}

void heapify(int arr[], int oldParent, int i) {
    // 1. 初始化父子节点索引
    int newParent = oldParent;
    int leftChild = 2 * oldParent + 1;
    int rightChild = 2 * oldParent + 2;

    // 2. 判断构建好后父节点应该在的位置 newParent
    if (leftChild < i && arr[newParent] < arr[leftChild]) newParent = leftChild;
    if (rightChild < i && arr[newParent] < arr[rightChild]) newParent = rightChild;

    // 3. 父节点更新的情况
    if (newParent != oldParent) {
        // 3.1 更新数组, 
        swap(arr, newParent, oldParent);
        // 3.2 维护交换后的子堆
        heapify(arr, newParent, i);
    }
}
package heap_sort;

public class Main {
    /**
     * @description: 堆排序
     * @param arr
     * @return void
     * @date: 2023/7/24 1:29
     */
    private static void heapSort(int[] arr) {
        // 1. 构建大顶堆(从第一个有孩子节点的地方开始维护)
        for (int i = arr.length / 2 - 1; i >= 0; -- i) {
            heapify(arr, i, arr.length);
        }

        // 2. 排序
        for (int len = arr.length - 1; len >= 1; -- len) {
            // 把大顶堆的堆顶元素与最后一个元素交换
            swap(arr, 0, len);
            // 对打乱的堆进行调整,恢复堆的特性
            heapify(arr, 0, len);
        }
    }

    /**
     * @description: 维护大顶堆的性质
     * @param arr
     * @param oldParent 原父节点坐标
     * @param len 需要构建的堆数组的长度
     * @return void
     * @date: 2023/7/24 1:50
     */
    private static void heapify(int[] arr, int oldParent, int len) {
        // 1. 初始化父子节点索引
        int newParent = oldParent;
        int leftChild = 2 * oldParent + 1;
        int rightChild = 2 * oldParent + 2;

        // 2. 判断构建好后父节点应该在的位置 newParent
        if (leftChild < len && arr[newParent] < arr[leftChild]) newParent = leftChild;
        if (rightChild < len && arr[newParent] < arr[rightChild]) newParent = rightChild;

        // 3. 父节点更新的情况
        if (newParent != oldParent) {
            // 3.1 更新数组, 
            swap(arr, newParent, oldParent);
            // 3.2 维护交换后的子堆
            heapify(arr, newParent, len);
        }
    }
}

11. 测试代码

#include <iostream>
#include <cstdlib>

using namespace std;

const int N = 100;

// 排序数组 
int arr[N];
// 数组长度 
int len;

void swap(int arr[], int i, int j) {
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}

int main() {
	len = rand() % N;
	printf("arr: "); 
	for (int i = 0; i < len; i ++) {
		arr[i] = rand() % N;
		printf("%d\t", arr[i]);
	}
	printf("\n"); 
	
	// ------------排序方法-----------
	
	xxx_sort(arr, 0, len - 1);
	
	// ------------------------------
	
	printf("arr: "); 
	for (int i = 0; i < len; i ++) {
		printf("%d\t", arr[i]);
	}
	return 0;
}
import java.util.Arrays;

public class Main {
    private static int MAX_LEN = 1000;
    private static int MAX_VALUE = 1000;

    private static int[] tempArr = new int[MAX_LEN];


    public static void main(String[] args) {
        int[] arr = new int[(int) (Math.random() * MAX_LEN + 1)];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * MAX_VALUE + 1);
        }
        System.out.println("arr: ");
        System.out.println(Arrays.toString(arr));

        // ------------排序方法-----------
        
        xxxSort(arr, 0, arr.length - 1);
        
        // ------------------------------
        
        System.out.println("arr: ");
        System.out.println(Arrays.toString(arr));

    }

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

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

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

相关文章

怎么在shell中查看python版本以及降低anaconda的python版本

输入命令 python --version 电脑anaconda的python版本为3.11&#xff0c;如何降低版本 &#xff0c;输入命令 conda install python3.9 当安装完anaconda后&#xff0c;ubuntu系统的shell命令行最前面会出现base字样&#xff0c;此时要退出&#xff0c;就输入命令 conda deacti…

如何开启QQ邮件的SMTP服务以及如何使用Python发送邮件

如何开启QQ邮件的SMTP服务以及如何使用Python发送邮件 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&…

Qt应用开发——Drag and Drop

目录 一、前言 二、相关事件和类 三、实例 拖动文件到编辑框 一、前言 在实际场景中&#xff0c;经常会有导入文件的需求。导入文件一般两种方式&#xff0c;第一种QFileDialog显示一个文件选择窗口&#xff0c;选择后处理和显示。第二种就是使用拖放机制实现。还有在一些制…

.faust加密勒索数据库恢复---惜分飞

有客户的win服务器被勒索病毒加密,里面运行有用友系统的Oracle数据库&#xff0c;加密提示为&#xff08;camry2020aol.com&#xff09;&#xff1a; 加密的数据文件类似&#xff08;.DBF.id[0E564ACA-3493].[camry2020aol.com].faust&#xff09;: 通过工具检测发现少量bl…

(2)前端控制器的扩展配置, 视图解析器类型以及MVC执行流程的概述

SpringMVC入门程序的扩展说明 注册前端控制器的细节 在web.xml文件注册SpringMVC的前端控制器DispatcherServlet时使用url-pattern标签中使用/和/*的区别 /可以匹配.html或.js或.css等方式的请求路径,但不匹配*.jsp的请求路径/*可以匹配所有请求(包括.jsp请求), 例如在过滤器…

Kotlin空安全类型之平台类型

前言 众所周知,Kotlin的空安全很方便,能避免绝大部分的空安全问题 一般类型分为: 可空类型如 String? 不可空类型 String其中可空类型的String?可以赋值null或String类型的值,在使用时必须显式的进行空处理 而不可空类型的String,只能赋值String类型,无法向其赋值null,使用时…

JAVA基础-Stream流

引言 Java 8 版本新增的Stream&#xff0c;配合同版本出现的Lambda &#xff0c;给我们操作集合&#xff08;Collection&#xff09;提供了极大的 便利。Stream流是JDK8新增的成员&#xff0c;允许以声明性方式处理数据集合&#xff0c;可以把Stream流看作是遍历数据集 合的一个…

【后端面经-Java】Java基本概念

【后端面经-Java】Java基本概念&#xff09; 1. 面向对象和面向过程1.1 概念1.2 优缺点对比 2. C和Java的区别2.1 "去其糟粕"——Java同学&#xff0c;你对C的这些东西有什么意见&#xff1f;2.2 改进之处————Java同学&#xff0c;你的这个论文&#xff0c;&…

伦敦金投资仓位控制的方法

留意本栏目过去的文章的朋友都会发现&#xff0c;其实小编认为资金管理很重要&#xff0c;甚至重要性超过技术分析找到入场机会。在资金管理中&#xff0c;关于仓位的控制是一门很大的学问&#xff0c;在伦敦金投资中&#xff0c;仓位的控制关系到我们盈亏的多少&#xff0c;甚…

利用百度地图做个亚洲范围地震可视化特效果

地图叠加等值面效果&#xff0c;绘制掩体模型 地震闪动特效 地震热力图效果

【人工智能】局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法

文章目录 局部搜索算法内存限制局部搜索算法示例:n-皇后爬山算法随机重启爬山模拟退火算法局部剪枝搜索遗传算法小结局部搜索算法 在某些规模太大的问题状态空间内,A*往往不够用 问题空间太大了无法访问 f 小于最优的所有状态通常,甚至无法储存整个边缘队列解决方案 设计选择…

vue-cli脚手架创建创建的项目打包后无法正常打开报 Failed to load resource: net::ERR_FILE_NOT_FOUND错误

亲爱的小伙伴们&#xff0c;你们最近是否有遇到用使用最新的脚手架打包项目后index.html文件无法正常打开&#xff0c;然后控制台报错的情况呢&#xff0c;不要担心&#xff0c;这个坑今天被我踩到了并且被我解决了&#xff0c;下边就让我来给大家分享一下经验吧&#xff01; …

树莓派4B通过wiringP库实现串口通信的实验

1.实现串口通信前的准备 树莓派4b实现与其它设备之间的串口通信需要做一些配置&#xff0c;可以点进这篇文章进行查看参考文章 wiringPi库串口相关的API参考文章链接wiringPI库串口API 2.实现单个字符的发送 #include <stdio.h> #include <wiringPi.h> #includ…

MFC第二十一天 CS架构多页面开发与数据交互、CImageList图像列表介绍 、CListCtrl-SetItem设置列表项的方法

文章目录 CImageList图像列表介绍CListCtrl图标的原理CListCtrl列表图标设置CListCtrl-SetItem设置列表项的方法 CS架构多页面开发与数据交互添加用户实现向导多页数据交互pch.hCLientXq.h CAppCPage1.hCPage1.cppCPage2.hCPage2.cppCWorkerDlg .hCWorkerDlg.cpp 多页数据修改C…

javascript实现九九乘法表

乘法表是初学者学习乘法基础的一个重要工具&#xff0c;同时也是程序员实践编程技能的一个常见项目。在本文中&#xff0c;我将介绍如何使用JavaScript实现一个简单的乘法表。 首先&#xff0c;我们需要明确乘法表的基本结构。乘法表通常是一个正方形的表格&#xff0c;包含从…

Ubuntu22.04部署K8s集群

Ubuntu22.04部署K8s集群 一、基础环境准备1.1 VMware Workstation Pro 17.01.2 Ubuntu22.04 二、系统环境配置2.1 设置Master与工作节点的机器名称及配置2.2 解析主机2.3 虚拟内存swap分区关闭2.4 开启IPv4转发2.5 设置时间同步2.6 开启防火墙的端口&#xff08;可选&#xff0…

【Spring Boot Admin】使用(整合Spring Security服务,添加鉴权)

Spring Boot Admin 监控平台 背景&#xff1a;Spring Boot Admin 监控平台不添加鉴权就直接访问的话&#xff0c;是非常不安全的。所以在生产环境中使用时&#xff0c;需要添加鉴权&#xff0c;只有通过鉴权后才能监控客户端服务。本文整合Spring Security进行实现。 pom依赖 …

前端开发实习总结参考范文(合集)

▼前端开发实习总结篇一 今天就简单聊聊上面的StrutsSpringHibernate吧。 Struts 代表&#xff1a;表示层;Spring代表&#xff1a;业务逻辑层;Hibernate则代表持久层。他们是目前在Java Web编程开发中用得最多的框架&#xff0c;其实这样区分是为了适应软件开发过程中各个分工…

SOC FPGA介绍及开发设计流程

目录 一、SoC FPGA简介 二、SoC FPGA开发流程 2.1 硬件开发 2.2 软件开发 一、SoC FPGA简介 SOC FPGA是在FPGA架构中集成了基于ARM的硬核处理器系统(HPS)&#xff0c;包括处理器、外设和存储器控制器。相较于传统的仅有ARM处理器或 FPGA 的嵌入式芯片&#xff0c;SOC FPGA既…

PHY芯片的使用(三)在linux下网络PHY的移植

1 前言 配置设备树请参考上一章。此次说明还是以裕太的YT8511芯片为例。 2 需要配置的文件及路径 a. 在 .. /drivers/net/phy 目录下添加 yt_phy.c 文件&#xff08;一般来说该驱动文件由厂家提供&#xff09;&#xff1b; b. 修改.. /drivers/net/phy 目录下的 Kconfig 文…