数据结构奇妙旅程之七大排序

news2024/11/17 1:32:34

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
系列专栏:xiaoxie的JAVA系列专栏——CSDN博客●'ᴗ'σσணღ*
我的目标:"团团等我💪( ◡̀_◡́ ҂)" 

( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​+关注(互三必回)!

 

一.排序的概念

  排序的概念
排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持
不变,即在原序列中, r[i]=r[j] ,且 r[i] r[j] 之前,而在排序后的序列中, r[i] 仍在 r[j] 之前,则称这种排序算法是稳 定的;否则称为不稳定的。
内部排序 :数据元素全部放在内存中的排序。
外部排序 :数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

二.插入排序

1.直接插入排序

直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到 一个新的有序序列 。实际中我们玩扑克牌时,就用了插入排序的思想。

1.过程

假设我们有一个数组array{15,87,63,5,98,23,1,82,10} ;我们如果使用直接插入排序的过程如下:

原始:    15  87  63 5 98 23 1 82 10

第一趟: 15  87  63 5 98 23 1 82 10

第二趟: 15  87  63 5 98 23 1 82 10

第三趟:15   63  87  5 98 23 1 82 10

......

第n(9)趟:  1 5 10 15 23 63 82 87 98

2.代码 

我们可以把他写为Java代码如下:

public class Sort {
    public static void insertSort(int[] array) {
        insert(array,0, array.length-1);
    }
    private static void insert(int[] array,int start,int end) {
        for (int i = start+1; i <= end; i++) {
            int tmp = array[i];
            int j = i-1;
            for (;j >= start; j--) {
                if(array[j] > tmp) {
                    array[j+1] = array[j];
                }else {
                    break;
                }
            }
            array[j+1] = tmp;
        }
    }
}

C++版本如下

#include <iostream>
using namespace std;

class Sort {
public:
    static void insertSort(int array[], int size) {
        insert(array, 0, size-1);
    }

private:
    static void insert(int array[], int start, int end) {
        for (int i = start+1; i <= end; i++) {
            int tmp = array[i];
            int j = i-1;
            for (; j >= start; j--) {
                if (array[j] > tmp) {
                    array[j+1] = array[j];
                } else {
                    break;
                }
            }
            array[j+1] = tmp;
        }
    }
};

3.时间复杂度

最好情况下:

直接插入排序在最好情况下也就是在数据都有序的情况下为O(n)

最坏情况下:

直接插入排序的最坏情况也就是在数据为逆序的情况下为O(n^2)

4.空间复杂度

因为直接插入排序是在本数组中实现的没有借用辅助空间所以为O(1)

5.稳定性

该算法为稳定

值得注意的是元素集合越接近有序,直接插入排序算法的时间效率越高。

2. 希尔排序( 缩小增量排序 )

希尔排序法又称缩小增量法。希尔排序法的基本思想是: 将待排序的数组按照一定的增量分组,对每个分组进行直接插入排序,然后逐步缩小增量,重复进行分组和直接插入排序的操作,直到增量缩小为1,最后进行最后一次直接插入排序。

1.过程

2.代码

java

public class Sort {
  
    public static void shellSort(int[] array) {
        int gap = array.length;
        while (gap > 1) {
            gap /= 2;
            Shell(array,gap);
        }
    }
    private static void Shell(int[] array,int gap) {
        for (int i = gap; i < array.length; i++) {
            int tmp = array[i];
            int j = i-gap;
            for (; j >= 0; j-=gap) {
                if(array[j] > tmp) {
                 array[j+gap] = array[j];
                }else {
                    break;
                }
            }
            array[j+gap] = tmp;
        }
    }
}

C++

#include <iostream>
using namespace std;

void shellSort(int array[], int size) {
    int gap = size;
    while (gap > 1) {
        gap /= 2;
        Shell(array, size, gap);
    }
}

void Shell(int array[], int size, int gap) {
    for (int i = gap; i < size; i++) {
        int tmp = array[i];
        int j = i - gap;
        for (; j >= 0; j -= gap) {
            if (array[j] > tmp) {
                array[j + gap] = array[j];
            } else {
                break;
            }
        }
        array[j + gap] = tmp;
    }
}

 3.时间复杂度

希尔排序的时间复杂度不好计算,因为 gap 的取值方法很多,导致很难去计算,因此在不同的书中给出的希尔排序的时间复杂度都不固定
《数据结构 (C 语言版 ) --- 严蔚敏

《数据结构-用面向对象方法与C++描述》--- 殷人昆

 

 4.空间复杂度

因为希尔排序是直接插入排序的优化所以是在本数组中实现的没有借用辅助空间所以为O(1)

5.稳定性

不稳定 

6.希尔排序的特性

1. 希尔排序是对直接插入排序的优化。
2. gap > 1 时都是预排序,目的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

三.选择排序

3.直接选择排序

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

1.过程

1.在元素集合array[i]--array[n-1]中选择关键码最大()的数据元素
2.若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换
3.在剩余的array[i]--array[n-2]array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素

2.代码

Java

public class Sort {
    public static void selectSort(int[] array) {
        select(array,0, array.length-1);
    }
    private static void select(int[] array,int start,int end) {
        for (int i = 0; i <= end ; i++) {
            int minIndex = i;
            for (int j = i+1; j <= end ; j++) {
                if(array[j] < array[minIndex]) {
                    minIndex = j;
                }
            }
            swap(array,i,minIndex);
        }
    }
    private static void swap(int[]array,int i,int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
}
C++
#include <iostream>
using namespace std;
void selectSort(int array[], int size) {
    select(array, 0, size - 1);
}

void select(int array[], int start, int end) {
    for (int i = 0; i <= end; i++) {
        int minIndex = i;
        for (int j = i + 1; j <= end; j++) {
            if (array[j] < array[minIndex]) {
                minIndex = j;
            }
        }
        swap(array, i, minIndex);
    }
}

void swap(int array[], int i, int j) {
    int tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}

3.时间复杂度

最好情况和最坏情况都为:O(n^2) 所以不是很推荐使用

4.空间复杂度

因为直接选择排序是在本数组中实现的没有借用辅助空间所以为O(1)

5.稳定性

不稳定

直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用

4.堆排序(需要重点掌握)

堆排序 (Heapsort) 是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。 需要注意的是排升序要建大堆,排降序建小堆

1.过程

2.代码

Java

private static void swap(int[]array,int i,int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
    public static  void heapSort(int[] array) {
        crateHeap(array);//首先创建大根堆
        int end = array.length-1;
        while (end >= 0) {
           swap(array,0,end);
           siftDown(array,0,end);
           end--;
        }
    }
    // 创建大根堆
    private static void crateHeap(int[] array) {
        for (int parent = (array.length-1-1)/2; parent >= 0; parent--) {
            siftDown(array,parent,array.length);
        }
    }
    // 向下调整
    private static void siftDown(int[] array,int parent,int len) {
        int child = 2*parent+1;
        while (child < len) {
            if(child+1 < len && array[child] < array[child+1]) {
                child++;
            }
            if(array[child] > array[parent]) {
                swap(array,child,parent);
                parent = child;
                child = 2*parent+1;
            }else {
                break;
            }
        }
    }

C++

#include <iostream>
using namespace std;

void swap(int array[], int i, int j) {
    int tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}

void heapSort(int array[], int length) {
    createHeap(array, length); // 首先创建大根堆
    int end = length - 1;
    while (end >= 0) {
        swap(array, 0, end);
        siftDown(array, 0, end);
        end--;
    }
}

// 创建大根堆
void createHeap(int array[], int length) {
    for (int parent = (length - 2) / 2; parent >= 0; parent--) {
        siftDown(array, parent, length);
    }
}

// 向下调整
void siftDown(int array[], int parent, int len) {
    int child = 2 * parent + 1;
    while (child < len) {
        if (child + 1 < len && array[child] < array[child + 1]) {
            child++;
        }
        if (array[child] > array[parent]) {
            swap(array, child, parent);
            parent = child;
            child = 2 * parent + 1;
        } else {
            break;
        }
    }
}

 3.时间复杂度

 因为堆是一颗完全二叉树所以他的时间复杂度为:O(n*logN)

4.空间复杂度

没有借助辅助空间所以空间复杂度为:O(1)

5.稳定性

不稳定

四.交换排序

基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是: 将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动

5.冒泡排序

1.过程

2.代码

Java

 private static void swap(int[]array,int i,int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
    public static void bubbleSort(int[] array) {
        //10个元素遍历9趟
        for (int i = 0; i < array.length-1; i++) {
            boolean flag = false;
            for (int j = 0; j < array.length-1-i; j++) {
                if(array[j] > array[j+1]) {
                    swap(array,j,j+1);
                    flag = true;
                }
            }
            //没有交换就证明有序
            if(flag == false) {
                return;
            }
        }
    }

C++

#include <iostream>
using namespace std;

void swap(int array[], int i, int j) {
    int tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}

void bubbleSort(int array[], int length) {
    // 对于10个元素,遍历9趟
    for (int i = 0; i < length - 1; i++) {
        bool flag = false;
        for (int j = 0; j < length - 1 - i; j++) {
            if (array[j] > array[j + 1]) {
                swap(array, j, j + 1);
                flag = true;
            }
        }
        // 若没有交换发生,则证明数组已有序
        if (!flag) {
            return;
        }
    }
}

3.时间复杂度

最好情况下:

冒泡排序在最好情况下也就是在数据都有序的情况下为O(n)

最坏情况下:

冒泡排序的最坏情况也就是在数据为逆序的情况下为O(n^2)

4.空间复杂度

没有借助辅助空间所以空间复杂度为:O(1)

5.稳定性

稳定

6.快速排序(重点掌握)

快速排序是 Hoare 1962 年提出的一种二叉树结构的交换排序方法,其基本思想为: 任取待排序元素序列中的某元 素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有 元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止
因为根据划分基准值的方法不同其过程也不一样,一般有Hoare法,挖坑法(常用)来划分基准值

1.1Hoare法过程

需要注意的是快速排序需要进行优化,防止出现像{1,2,3,4,5,6,7,8,9}这样的情况如果出现这种情况,二叉树会变成一颗斜树,降低排序速率这时候我们需要使用1 .三数取中法选基准值
如果 . 递归到小的子区间时,可以考虑使用插入排序 (这里就不优化了感兴趣的可以自己下去实现)

1.2Hoare法代码

  private static void swap(int[]array,int i,int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
    public static void quickSort(int[] array) {
        quick(array,0, array.length-1);
    }

    private static void quick(int[] array,int left,int right) {
        if(right-left <= 1) {
            return;
        }
        //三数取中法
        int index = middleNum(array,left,right);
        swap(array,left,index);
        int pivot = partitionHoare(array,left,right);
        quick(array,left,pivot-1);//递归左边
        quick(array,pivot+1,right);//递归右边
    }
    //三数取中
    private static int middleNum(int[] array,int start,int end) {
        int mid = start+((end-start)>>1);
        if(array[start] <  array[end]) {
            if(array[mid] > array[end]) {
                return end;
            } else if (array[mid] < array[start]) {
                return start;
            }else {
                return mid;
            }
        }else {
            if(array[mid] < array[end]) {
                return end;
            } else if (array[mid] > array[start]) {
                return start;
            }else {
                return mid;
            }
        }
    }
    //获取基准值的位置使用Hoare法
    private static int partitionHoare(int[] array,int left ,int right) {
        int tmp = array[left];//基准值
        int i = left;//记录下来基准值开始的下标
        while (left < right) {
            while (left < right && array[right] >= tmp) {
                right--;
            }
            while (left < right && array[left] <= tmp) {
                left++;
            }
            swap(array,left,right);
        }
        swap(array,left,i);
        return left;
    }

C++版本

#include <iostream>
using namespace std;

void swap(int array[], int i, int j) {
    int tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}

void quickSort(int array[], int length) {
    quick(array, 0, length - 1);
}

void quick(int array[], int left, int right) {
    if (right - left <= 1) {
        return;
    }
    // 三数取中法
    int index = middleNum(array, left, right);
    swap(array, left, index);
    int pivot = partitionHoare(array, left, right);
    quick(array, left, pivot - 1); // 递归左边
    quick(array, pivot + 1, right); // 递归右边
}

// 三数取中
int middleNum(int array[], int start, int end) {
    int mid = start + ((end - start) >> 1);
    if (array[start] < array[end]) {
        if (array[mid] > array[end]) {
            return end;
        } else if (array[mid] < array[start]) {
            return start;
        } else {
            return mid;
        }
    } else {
        if (array[mid] < array[end]) {
            return end;
        } else if (array[mid] > array[start]) {
            return start;
        } else {
            return mid;
        }
    }
}

// 获取基准值的位置使用Hoare法
int partitionHoare(int array[], int left, int right) {
    int tmp = array[left]; // 基准值
    int i = left; // 记录下来基准值开始的下标
    while (left < right) {
        while (left < right && array[right] >= tmp) {
            right--;
        }
        while (left < right && array[left] <= tmp) {
            left++;
        }
        swap(array, left, right);
    }
    swap(array, left, i);
    return left;
}

2.1挖坑法过程(重点掌握)考试选择题过程一般使用挖坑法

2.2 挖坑法代码(重点掌握)

Java

 private static void swap(int[]array,int i,int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
    public static void quickSort(int[] array) {
        quick(array,0, array.length-1);
    }

    private static void quick(int[] array,int left,int right) {
        if(right-left <= 1) {
            return;
        }
        //三数取中法
        int index = middleNum(array,left,right);
        swap(array,left,index);
        int pivot = partition(array,left,right);
        quick(array,left,pivot-1);//递归左边
        quick(array,pivot+1,right);//递归右边
    }
    //三数取中
    private static int middleNum(int[] array,int start,int end) {
        int mid = start+((end-start)>>1);
        if(array[start] <  array[end]) {
            if(array[mid] > array[end]) {
                return end;
            } else if (array[mid] < array[start]) {
                return start;
            }else {
                return mid;
            }
        }else {
            if(array[mid] < array[end]) {
                return end;
            } else if (array[mid] > array[start]) {
                return start;
            }else {
                return mid;
            }
        }
    }
    //获取基准值的位置使用挖坑法
    private static int partition(int[] array,int left ,int right) {
        int tmp = array[left];//记录基准值
        while (left < right) {
            while (left < right && array[right] >=  tmp) {
                right--;
            }
            array[left] = array[right];
            while (left < right && array[left] <= tmp) {
                left++;
            }
            array[right] = array[left];
        }
        array[left] = tmp;// 将基准值放入正确位置
        return left;
    }

C++

#include <iostream>
using namespace std;

void swap(int array[], int i, int j) {
    int tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}

void quickSort(int array[], int length) {
    quick(array, 0, length - 1);
}

void quick(int array[], int left, int right) {
    if (right - left <= 1) {
        return;
    }
    // 三数取中法
    int index = middleNum(array, left, right);
    swap(array, left, index);
    int pivot = partition(array, left, right);
    quick(array, left, pivot - 1); // 递归左边
    quick(array, pivot + 1, right); // 递归右边
}

// 三数取中
int middleNum(int array[], int start, int end) {
    int mid = start + ((end - start) >> 1);
    if (array[start] < array[end]) {
        if (array[mid] > array[end]) {
            return end;
        } else if (array[mid] < array[start]) {
            return start;
        } else {
            return mid;
        }
    } else {
        if (array[mid] < array[end]) {
            return end;
        } else if (array[mid] > array[start]) {
            return start;
        } else {
            return mid;
        }
    }
}

// 获取基准值的位置使用挖坑法
int partition(int array[], int left, int right) {
    int pivot = array[left]; // 基准值
    while (left < right) {
        while (left < right && array[right] >= pivot) {
            right--;
        }
        array[left] = array[right];

        while (left < right && array[left] <= pivot) {
            left++;
        }
        array[right] = array[left];
    }
    array[left] = pivot; // 将基准值放入正确位置
    return left;
}

3.时间复杂度

最好情况下数据为无序的时候为O(n*logN)

最坏情况下数据为有序或者是逆序的时候为O(n^2)。 

4.空间复杂度

在递归调用过程中,需要使用O(log n)的栈空间来存储递归调用的上下文信息所以空间复杂度为:O(logN)

5.稳定性

不稳定

7.归并排序(重点掌握)

归并排序( MERGE-SORT )是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法( Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使 子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

1.过程

2.代码

Java

public static void mergeSort(int[] array) {
        mergeFunc(array,0,array.length-1);
    }
    private static void mergeFunc(int[] array,int left,int right) {
        if(left >= right) {
            return;
        }
        int mid = left + ((right-left) >> 1);
        //开始分解
        mergeFunc(array,left,mid);
        mergeFunc(array, mid+1, right);
        //开始合并
        merge(array,left,right,mid);
    }
    private static void merge(int[] array,int left,int right,int mid) {
        int s1 = left;
        int e1 = mid;
        int s2 = mid+1;
        int e2 = right;
        int[] tmp = new int[right-left+1];//创建一个临时数组来储存数据
        int k = 0;//临时数组下标
        while (s1 <= e1 && s2 <= e2) {
            if(array[s1] <= array[s2]) {
                tmp[k++] = array[s1++];
            }else {
                tmp[k++] = array[s2++];
            }
        }
        //看那个数组还有数据就拷贝过去
        while (s1 <= e1) {
            tmp[k++] = array[s1++];
        }
        while (s2 <= e2) {
            tmp[k++] = array[s2++];
        }
        //3.拷贝到源数组
        for (int i = 0; i < k; i++) {
            array[i+left] = tmp[i];
        }
    }

C++

#include <iostream>
using namespace std;

void mergeSort(int array[], int length) {
    mergeFunc(array, 0, length - 1);
}

void mergeFunc(int array[], int left, int right) {
    if (left >= right) {
        return;
    }
    int mid = left + ((right - left) >> 1);
    // 开始分解
    mergeFunc(array, left, mid);
    mergeFunc(array, mid + 1, right);
    // 开始合并
    merge(array, left, right, mid);
}

void merge(int array[], int left, int right, int mid) {
    int s1 = left;
    int e1 = mid;
    int s2 = mid + 1;
    int e2 = right;
    int tmp[right - left + 1]; // 创建一个临时数组来储存数据
    int k = 0; // 临时数组下标

    while (s1 <= e1 && s2 <= e2) {
        if (array[s1] <= array[s2]) {
            tmp[k++] = array[s1++];
        } else {
            tmp[k++] = array[s2++];
        }
    }

    // 看那个数组还有数据就拷贝过去
    while (s1 <= e1) {
        tmp[k++] = array[s1++];
    }
    while (s2 <= e2) {
        tmp[k++] = array[s2++];
    }

    // 3.拷贝到源数组
    for (int i = 0; i < k; i++) {
        array[i + left] = tmp[i];
    }
}

 3.时间复杂度

时间复杂度为O(n*logN)

4.空间复杂度

因为需要借助临时数组所以空间复杂度为O(n)

5.稳定性

稳定

五.各个排序算法的时间复杂度和空间复杂度以及稳定性总结

以上就是关于基于比较排序的所以的内容了,如果有帮助到你,创作不易希望可以给博主一个关注,感谢你的阅读,希望能够对你有所帮助 

 

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

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

相关文章

欧拉计划第816题:求大量点的最短距离

本次来解决欧拉计划的第816题: 解: 第一步:最原始的算法 先从简单的情况开始,即原题里的14个点的情况 import mathdef gen_points(n):s = [0] * (2*n)s[0] = 290797for i in range(1, 2*n):s[i] = (s[i - 1] * s[i - 1]) % 50515093p = [(s[2 * i], s[2 * i + 1]) for…

Android悬浮窗的实现

最近想做一个悬浮窗秒表的功能&#xff0c;所以看下悬浮窗具体的实现步骤 1、初识WindowManager 实现悬浮窗主要用到的是WindowManager SystemService(Context.WINDOW_SERVICE) public interface WindowManager extends ViewManager {... }WindowManager是接口类&#xff0c…

【HTML教程】跟着菜鸟学语言—HTML5个人笔记经验(五)完结

HTML学习第五天 PS&#xff1a;牛牛只是每天花了1.5-2小时左右来学习HTML。这也是最后一天&#xff0c;其实HTML只需要1-2天就可以学完&#xff01; 书接上回 HTML 脚本 JavaScript 使 HTML 页面具有更强的动态和交互性。 尝试一下&#x1f3f7; 插入一段脚本 <!DOCT…

C语言菜鸟入门·判断语句(if语句、if...else语句、嵌套if语句)详细介绍

目录 1. if语句 2. if...else语句 3. if...else if...else 语句 4. 嵌套if语句 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。 语句描述if语句一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。if...else语句一个 if 语句 后可跟…

Flutter 应用服务:主题、暗黑、国际化、本地化-app_service库

Flutter应用服务 主题、暗黑、国际化、本地化-app_service库 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/det…

FullStack之Django(1)开发环境配置

FullStack之Django(1)开发环境配置 author: Once Day date&#xff1a;2022年2月11日/2024年1月27日 漫漫长路&#xff0c;才刚刚开始… 全系列文档请查看专栏: FullStack开发_Once_day的博客-CSDN博客Django开发_Once_day的博客-CSDN博客 具体参考文档: The web framewor…

从比亚迪的整车智能战略,看王传福的前瞻市场布局

众所周知&#xff0c;作为中国新能源汽车的代表企业&#xff0c;比亚迪在中国乃至全球的新能源汽车市场一直都扮演着引领者的角色。2024年新年伊始&#xff0c;比亚迪又为新能源汽车带来了一项重磅发布。 整车智能才是真智能 近日&#xff0c;在“2024比亚迪梦想日”上&#xf…

微服务-微服务Alibaba-Nacos 源码分析(上)

Nacos&Ribbon&Feign核心微服务架构图 架构原理 1、微服务系统在启动时将自己注册到服务注册中心&#xff0c;同时外发布 Http 接口供其它系统调用(一般都是基于Spring MVC) 2、服务消费者基于 Feign 调用服务提供者对外发布的接口&#xff0c;先对调用的本地接口加上…

Java强训day11(选择题编程题)

选择题 编程题 题目1 import java.util.Scanner;public class Main {public static String TentoTwo(int n) {StringBuffer sum new StringBuffer();while (n ! 0) {sum.append(n % 2);n / 2;}return sum.reverse().toString();}public static void main(String[] args) {S…

大模型日报-20240130

500行代码构建对话搜索引擎&#xff0c;贾扬清被内涵的Lepton Search真开源了 来了&#xff0c;贾扬清承诺的 Lepton Search 开源代码来了。前天&#xff0c;贾扬清在 Twitter 上公布了 Lepton Search 的开源项目链接&#xff0c;并表示任何人、任何公司都可以自由使用开源代码…

【STM32F103单片机】利用ST-LINK V2烧录程序 面包板的使用

1、ST‐LINK V2安装 参考&#xff1a; http://t.csdnimg.cn/Ulhhq 成功&#xff1a; 2、烧录器接线 背后有标识的引脚对应&#xff1a; 3、烧录成功 烧录成功后&#xff0c;按下核心板的RESET键复位&#xff01;&#xff01;&#xff01;即可成功&#xff01; 4、面包板的…

如何改变音频的频率教程

这是一篇教你如何通过一些工具改变音频频率的教学文章。全程所用的软件都是免费的。 本文用到的软件&#xff1a; AIX智能下载器 用于抓取任何视频网站资源的插件 格式工厂 将mp4转化为mp3 Audacity 改变音频频率的软件 如果你已备好mp3或其他格式的音频&#xff0c;那么直接看…

AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提前方法分享)

Java可使用的OCR工具Tess4J使用举例 1.简介1.1 简单介绍1.2 官方说明 2.使用举例2.1 依赖及语言数据包2.2 核心代码2.3 识别身份证信息2.3.1 核心代码2.3.2 截取指定字符2.3.3 去掉字符串里的非中文字符2.3.4 提取出生日期&#xff08;待优化&#xff09;2.3.5 实测 3.总结 1.简…

谷歌人工智能视频生成器-LUMIERE(未开源)

Google重磅发布视频生成模型Lumiere 据说后续会开源 亮点1.支持文本到视频与图像到视频 亮点2.画风迁移 亮点3.运动蒙版 亮点4.视频编辑 亮点5.视频修复 谷歌视频模型可以生成80帧的片段&#xff01;不仅画质好、质量高&#xff0c;而且时长更长。 视频局部编辑 这项功能可以…

Python进阶(4) | 创建Python库的模板工程 Python-lib-starter

Python进阶(4) | 创建Python库的模板工程 Python-lib-starter 文章目录 Python进阶(4) | 创建Python库的模板工程 Python-lib-starter1. 目的2. Python-lib-starter 目录结构浅析2.1 关键目录和文件2.2 非关键目录和文件 3. moelib 目录分析3.1 __init__.py延迟评估类型注解的意…

flink cdc,standalone模式下,任务运行一段时间taskmanager挂掉

在使用flink cdc&#xff0c;配置任务运行&#xff0c;过了几天后&#xff0c;任务无故取消&#xff0c;超时&#xff0c;导致taskmanager挂掉&#xff0c;相关异常如下&#xff1a; 异常1&#xff1a; did not react to cancelling signal interrupting; it is stuck for 30 s…

最新详细eclipse下载、安装、汉化教程

一、下载eclipse安装包 首先进入 eclipse官网 如下&#xff1a; 这里面有很多版本&#xff1b;我们小白一般选择第二个&#xff0c;向下滑动&#xff1b; 点击符合自己系统的版本。 这里我们切换镜像下载&#xff0c;一般选择离你最近的地址下载。 我建议选择大连东软信息学…

Python 数据分析实战——社交游戏的用户流失?酒卷隆治_案例2

# 什么样的顾客会选择离开 # 数据集 DAU : 每天至少来访问一次的用户数据 数据内容 数据类型 字段名 访问时间 string&#xff08;字符串&#xff09; log_data 应用名称 string&#xff08;字符串&#xff09; app_name 用户 ID int&#xff08;数值&#xff09; user_id…

项目经理,如何管理好自己的情绪?

在现代社会中&#xff0c;压力无处不在。对于项目经理来说&#xff0c;压力更是来自各个方面&#xff0c;如项目进度、团队管理、客户需求等。当压力过大时&#xff0c;情绪就容易受到影响&#xff0c;如果无法控制自己的情绪&#xff0c;不仅会影响自己的工作效率&#xff0c;…

uniapp对接微信APP支付返回requestPayment:fail [payment微信:-1]General errors错误-全网总结详解

一、问题描述 uniapp对接微信APP支付&#xff0c;本来是很简单的一件事&#xff0c;后端本来就是好的&#xff0c;只要填一些参数就行了&#xff0c;搞了我一晚上&#xff0c;主要卡在uniapp这边&#xff0c;拉起支付的时候&#xff0c;一直提示以下错误&#xff1a; {"er…