排序类算法

目录

一、交换类排序

1.冒泡排序

2.快速排序

二、 插入排序

1.直接插入排序

2.折半插入排序

3.希尔排序

三、选择排序

1.简单选择排序

2.堆排序

 完整代码

四、归并排序

 完整代码

五、汇总

六、OJ练习 

        1.冒泡排序:正确表示前一个数和后一个数   

2.选择、堆、归并

完整代码 


一、交换类排序

1.冒泡排序

演示地址:

Comparison Sorting Visualization

 注意:n个数

1.交换条件 如果从小到大排列那么  判断 大数在前就发生交换

2.注意外层循环控制趟数 i从0 到  n-1趟    i++

3.注意内层循环控制遍历着进行交换  从后往前 n-1  到   i   j不能取0因为里面有j-1   j--

4.注意flag是看是否进行交换  经过一趟后没有发生交换则序列本身有序

#include <stdio.h>


void BubbleSort(int A[10],int n);

void swap(int &a,int &b){
    int temp=a;
    a=b;
    b=temp;
}

int main() {
    int A[10]={9,7,8,6,5,4,3,2,1,0};
    BubbleSort(A,10);
    for (int i = 0; i < 10; ++i) {
        printf("%2d",A[i]);
    }
    return 0;
}

void BubbleSort(int A[10],int n) {
    //控制趟数
    for (int i = 0; i < n - 1; ++i) {
        //交换标志
        bool flag= false;
        //控制交换
        for (int j = n-1; j > i; j--) {
            //从小到大排列 大的在前那么就要发生交换了
            if (A[j-1]>A[j]){
                swap(A[j],A[j-1]);
                flag= true;
            }
        }
        if (!flag){
            //如果经过依次检查后没有发生交换则该数组本身有序
            return;
        }
    }
}

2.快速排序

注意:分治思想

        挖坑法(不断覆盖)得到分隔值的位置

        注意每次循环都要判断   low<high

        注意出现相等的数我们不用管--不需要处理

        最终low与high是相等的

演示地址:

Comparison Sorting Visualization

16.5 快速排序 

64, 94, 95, 79, 69, 84, 18, 22, 12 ,78

把比64小的放在64的左边,把比64大的放在它的右边
18, 22, 12 64  ,94, 95, 79, 69, 84,78

16.6 快速排序实战
原来的
64, 94, 95, 79, 69, 84, 18, 22, 12 ,78


pivot=64
12, 22, 18, 64, 69, 84, 79, 95, 94 ,78
                 high
                 low
pivot=64
12, 94, 95, 79, 69, 84, 18, 22, 12 ,78
                                               high
     low
 

#include <stdio.h>

//得到分割值的位置--挖坑法(不断覆盖)
int getPosition(int A[],int low,int high){
    //把low的位置作为分隔值
    int provt=A[low];
    while (low<high){
        //从high往前找比分隔值小的数的位置--注意循环里面也要判断low<high
        while (low<high&&A[high]>=provt){
            //没有找到就往前移动
            high--;
        }
        //出循环 这时A[high]<provt  就找到了 这个小的元素
        //我们需要把它覆盖到low的位置上
        A[low]=A[high];
        //从low往后找 直到找到比分隔值大的元素--注意循环里面也要判断low<high
        while (low<high&&A[low]<=provt){
            low++;
        }
        //此时A[low]>provt 找到了大的元素我们需要把它放到分割值的右边
        //因此我们需要把它覆盖到high的位置上
        A[high]=A[low];
    }
    //不要忘记把分隔值赋值上去
    A[low]=provt;
    //此时low=high的
    return low;
}


//快速排序--分治思想
void quickSort(int A[],int low,int high){
    if (low>=high){
        return;
    }
    //进行第一次快速排序得到分隔值的位置
    int position=getPosition(A,low,high);
    //接下来排列分隔值的左边
    quickSort(A,low,position-1);
    //接下来排列分隔值的右边
    quickSort(A,position+1,high);
}

二、 插入排序

1.直接插入排序

注意:

        外层循环控制:无序序列的个数--即要插入的元素个数  i从 1到len-1

        内层循环控制交换 注意条件 

        此时j的位置是从i-1开始 j>=0&&A[j]>inserVal 那么就将后面的元素进行覆盖

        注意最后要将j+1的位置即为要插入的位置

        因为循环完成后我们直到j这个位置是小于inserVal的所以要插入到这个位置的后面

16.7 插入排序的原理及实战

insertVal=1
                           i
    1 2 3 72 78      87 61 38 12 40
 j

//玩坑法(覆盖)  插入排序
void insertSort(int A[],int len){
    int i,j,inserVal;
    //注意循环起始  此时有序数列中左半边为1个元素  所以无序的右半边从 1开始到len-1
    for (i = 1; i < len; ++i) {//外层循环控制要插入的数量
        //存储当前要插入的值
        inserVal=A[i];
        //那么我们判断就从有序的开始  i-1  到0--并且这个元素大于要插入的元素那么就进行覆盖
        for (j = i-1; j >=0&&A[j]>inserVal ; j--) {
            //就将后面的元素覆盖成大的那一个
            A[j+1]=A[j];
        }
        //最终要将插入元素进行插入-这里要使用到j因此要将j定义到循环外面
        //如果最终j--到0了 那么此时将j+1的位置也就是0的位置即插入位置
        A[j+1]=inserVal;
    }
}

2.折半插入排序

3.希尔排序

三、选择排序

1.简单选择排序

注意:

         内层循环:

        找到那么就记录该位置--必须写在这  因为我们要把后续的位置找全  找出最小
        如果写在循环条件处那么 它就会找到一个就交换一次  而不是最小才交换  注意最小条件

//简单选择排序
void selectSort(int A[],int len){
    int min;
    for (int i = 0; i < len - 1; ++i) {
        //外层循环控制趟数
        //每次都找出一个最小的 交换那么  只需要找len-1次
        //记录最小值位置
        min=i;
        //内层循环从未确定的序列中找最小的位置 因此从i+1开始到结束
        for (int j = i+1; j < len; ++j) {
            //找到那么就记录该位置--必须写在这  因为我们要把后续的位置找全  找出最小
            //如果写在循环条件处那么 它就会找到一个就交换一次  而不是最小才交换  注意最小条件
            if (A[j]<A[min]){
                min=j;
            }
        }
        //进行交换
        swap(A[min],A[i]);
    }
}

2.堆排序


演示地址:Heap Sort Visualization

每次调整大根堆的时间复杂度为树的高度  调整n次  因此为n*logn

 

 

 注意:

        1.循环调整子树为大根堆的循环条件(son<len)--注意调整完后要重置dad与son

           因为这颗子树可能下面还有子树 

           我们需要让dad=son的 son=2*dad+1 这这颗子树也满足大根堆依次往复

        2.注意len是代表什么

        3.注意建立大根堆的循环条件  i是从最后一个父节点开始到0

        4.注意循环剩余元素为大根堆的循环条件 

        i代表无序的个数 i从len-1到1 直到调整到剩余俩个元素

 

 

//交换
void swap(int &a,int &b){
    int temp=a;
    a=b;
    b=temp;
}

/**
 * 调整一个子树为大根堆
 * @param A
 * @param dad 最后一个节点的父节点位置
 * @param len 需要调整的长度
 */
void adjustMaxTree(int A[],int last,int len){
    int dad=last;
    int son=2*dad+1;
    while (son<len){
        if (son+1<len&&A[son]<A[son+1]){
            //比较左 右 孩子中最大的元素
            //如果左孩子 小于 右孩子--最大元素为右孩子
            son++;//拿右孩子
        }
        //得到最大元素为A[son]
        if (A[son]>A[dad]){//如果孩子大于父亲 交换
            //将孩子中最大的放到根节点上
            swap(A[son],A[dad]);
            //重置父子节点位置
            dad=son;//son重新作为dad去验证下面的子树是否为大根堆--
            son=2*dad+1;
            //继续循环重新进行调整我们交换完的下面的那颗子树是否满足大根堆
        } else{
            //这个子树中的所有的子树全部满足大根堆
            break;
        }

    }
}

//堆排序
void heapSort(int A[],int len){
    //建立大根堆
    for (int i = len/2-1; i >= 0; i--) {
        //从最后一个子树的父亲节点开始到0
        adjustMaxTree(A,i,len);
    }
    //将最大元素放到数组末尾
    swap(A[0],A[len-1]);
    //调整剩余元素为大根堆并从小到大排列--调整到只剩2个元素
    for (int i = len-1; i > 1; i--) {
        //i代表的是无序的个数
        //因为把最大的元素放到了最后一个树节点上 那么每次都要调整 父亲节点地址为0 长度为 i的元素为大跟堆
        adjustMaxTree(A,0,i);
        //调整之后进行交换--交换根部元素
        swap(A[0],A[i-1]);
    }
}

 完整代码

#include <stdio.h>


//交换
void swap(int &a,int &b){
    int temp=a;
    a=b;
    b=temp;
}

/**
 * 调整一个子树为大根堆
 * @param A
 * @param dad 最后一个节点的父节点位置
 * @param len 需要调整的长度
 */
void adjustMaxTree(int A[],int last,int len){
    int dad=last;
    int son=2*dad+1;
    while (son<len){
        if (son+1<len&&A[son]<A[son+1]){
            //比较左 右 孩子中最大的元素
            //如果左孩子 小于 右孩子--最大元素为右孩子
            son++;//拿右孩子
        }
        //得到最大元素为A[son]
        if (A[son]>A[dad]){//如果孩子大于父亲 交换
            //将孩子中最大的放到根节点上
            swap(A[son],A[dad]);
            //重置父子节点位置
            dad=son;//son重新作为dad去验证下面的子树是否为大根堆--
            son=2*dad+1;
            //继续循环重新进行调整我们交换完的下面的那颗子树是否满足大根堆
        } else{
            //这个子树中的所有的子树全部满足大根堆
            break;
        }

    }
}

//堆排序
void heapSort(int A[],int len){
    //建立大根堆
    for (int i = len/2-1; i >= 0; i--) {
        //从最后一个子树的父亲节点开始到0
        adjustMaxTree(A,i,len);
    }
    //将最大元素放到数组末尾
    swap(A[0],A[len-1]);
    //调整剩余元素为大根堆并从小到大排列--调整到只剩2个元素
    for (int i = len-1; i > 1; i--) {
        //i代表的是无序的个数
        //因为把最大的元素放到了最后一个树节点上 那么每次都要调整 父亲节点地址为0 长度为 i的元素为大跟堆
        adjustMaxTree(A,0,i);
        //调整之后进行交换--交换根部元素
        swap(A[0],A[i-1]);
    }
}

int main() {
    int A[10]={58,42,13,58,44,53,73,75,2,69};
    int len=10;
    heapSort(A,len);
    for (int i = 0; i < 10; ++i) {
        printf("%3d",A[i]);
    }
    return 0;
}

四、归并排序

注意:

        1.复制临时数组  static int B[N];

        2.复制的时候for循环从low开始  避免覆盖掉之前的元素

        3.合并的时候  注意合并的那个数组A  k是从low开始  避免覆盖掉之间的元素

        4.不要忘记 剩余元素的合并

#define N 50

void merge(int A[],int low,int mid,int high){
    //注意static无论递归多少次都只有一个B
    static int  B[N];
    //复制临时数组--注意这里是low 到high
    for (int i = low; i <= high; ++i) {
        B[i]=A[i];
    }
    int i,j,k;
    //注意k是从low开始
    for ( i = low,j=mid+1,k=low;i<=mid&&j<=high; k++) {
        //i j 的元素值进行比较 小的放入A中--并且放入的元素的那个向后移动
        if (B[i]<B[j]){
            A[k]=B[i++];
        } else{
            A[k]=B[j++];
        }
    }
    //看哪个有剩余都放入到A中即可
    while (i<=mid){
        A[k++]=B[i++];
    }
    while (j<=high){
        A[k++]=B[j++];
    }
}

void mergeSort(int A[],int low,int high){
    if (low<high){
        int mid=(low+high)/2;
        //排序前半边
        mergeSort(A,low,mid);
        //排序号后半边
        mergeSort(A,mid+1,high);
        //合并为有序数组
        merge(A,low,mid,high);
    }
}

 完整代码

#include <stdio.h>

#define N 50

void merge(int A[],int low,int mid,int high){
    //注意static无论递归多少次都只有一个B
    static int  B[N];
    //复制临时数组--注意这里是low 到high
    for (int i = low; i <= high; ++i) {
        B[i]=A[i];
    }
    int i,j,k;
    //注意k是从low开始
    for ( i = low,j=mid+1,k=low;i<=mid&&j<=high; k++) {
        //i j 的元素值进行比较 小的放入A中--并且放入的元素的那个向后移动
        if (B[i]<B[j]){
            A[k]=B[i++];
        } else{
            A[k]=B[j++];
        }
    }
    //看哪个有剩余都放入到A中即可
    while (i<=mid){
        A[k++]=B[i++];
    }
    while (j<=high){
        A[k++]=B[j++];
    }
}

void mergeSort(int A[],int low,int high){
    if (low<high){
        int mid=(low+high)/2;
        //排序前半边
        mergeSort(A,low,mid);
        //排序号后半边
        mergeSort(A,mid+1,high);
        //合并为有序数组
        merge(A,low,mid,high);
    }
}

int main() {
    int A[10]={58,42,13,58,44,53,73,75,2,69};
    int low=0,high=9;
    mergeSort(A,low,high);
    for (int i = 0; i <10; ++i) {
        printf("%3d",A[i]);
    }
    return 0;
}

五、汇总

六、OJ练习 

注意:

        1.冒泡排序:正确表示前一个数和后一个数   

        j--

#include <stdio.h>

//读取10个整型数据12 63 58 95 41 35 65  0 38 44,
// 然后通过冒泡排序,快速排序,插入排序,分别对该组数据进行排序,输出3次有序结果,每个数的输出占3个空格

//交换
void swap(int &a,int &b){
    int temp=a;
    a=b;
    b=temp;
}

void print_A(int A[],int len){
    //排序完成
    for (int i = 0; i < len; ++i) {
        printf("%3d",A[i]);
    }
    printf("\n");
}

//冒泡排序
void BubbleSort(int A[],int len){
    bool flag= false;
    for (int i = 0; i < len ; ++i) {
        for (int j = len-1; j > i; j--) {
            //从小到大 如果前面比后面大交换
            if (A[j-1]>A[j]){
                swap(A[j-1],A[j]);
                flag= true;
            }
        }
        if (!flag){
            return;
        }
    }
    print_A(A,len);
}

//挖坑法--分割
int patition(int A[],int low,int high){
    //先将low的位置作为分割值
    int provt=A[low];
    while (low<high){
        //从后往前找比分隔值小的数进行覆盖
        while (low<high&&A[high]>=provt){
            high--;
        }
        //此时A[high]<provt
        A[low]=A[high];
        //从前往后找比分隔值大数进行覆盖
        while (low<high&&A[low]<=provt){
            low++;
        }
        //此时A[low]>provt
        A[high]=A[low];
    }
    //填入分隔值
    A[low]=provt;
    return low;
}

//快速排序--分治
void quickSort(int A[],int low,int high){
    if (low>high){
        return;
    }
    //确定一个分割位置
    int position=patition(A,low,high);
    //排序左边
    quickSort(A,low,position-1);
    //排序右边
    quickSort(A,position+1,high);
}

//插入排序
void inserSort(int A[],int len){
    int i,j,insertVal;
    for (i = 1; i < len; ++i) {
        insertVal=A[i];
        for (j = i-1; j >=0&&A[j]>insertVal; j--) {
            //交换
            A[j+1]=A[j];
        }
        //插入
        A[j+1]=insertVal;
    }
    print_A(A,len);
}


int main() {
    int A[10];
    for (int i = 0; i < 10; ++i) {
        int x;
        scanf("%d",&x);
        A[i]=x;
    }
    int len=10;
    BubbleSort(A,len);
    quickSort(A,0,len-1);
    print_A(A,len);
    inserSort(A,len);
    return 0;
}

2.选择、堆、归并

选择排序:注意  找到最小的后是交换 而不是覆盖

堆排序:  注意第一次建立完大根堆后  将根节点(最大)与最后一个节点进行交换

                然后再依次进行 大根堆的建立 建立的时候 因为最后都改变了根节点与最后一个元                  素的值  那么每次建立大根堆的父节点都是从0开始  注意起始条件

归并排序:注意不要忘记剩余节点也要合为一个数组

//交换
void swap(int &a,int &b){
    int temp=a;
    a=b;
    b=temp;
}

//选择排序--找最小的放到前面/找最大的放到后面
void SelectSort(int A[],int len){
    int i=0,min,j;
    int temp=A[i];
    while (i<len){
        min=i;
        for (j = i+1; j < len; ++j) {
            if (A[min]>A[j]){
                min=j;
            }
        }
        //找到了最小值
        swap(A[i++],A[min]);
    }
}

//建立大根堆
void buildMaxTree(int A[],int last,int len){
    int dad=last;
    int son=last*2+1;
    while (son<len){
        if (son+1<len&&A[son]<A[son+1]){
            son++;//拿到右孩子作为最大
        }
        //最大的孩子节点值与父节点比较替换
        if (A[son]>A[dad]){
            swap(A[son],A[dad]);
            //重置dad与son 为下一个子树
            dad=son;
            son=2*dad+1;
        } else{
            //全部变为大根堆 没有任何交换后--退出循环
            break;
        }
    }
}

//堆排序
void heapSort(int A[],int len){
    //对于初始数组建立大根堆
    for (int i = len/2-1; i >= 0; i--) {
        buildMaxTree(A,i,len);
    }
    //之后交换根节点与最后一个节点
    swap(A[0],A[len-1]);
    //堆剩余元素进行大根堆的依次建立--直到仅剩余2个节点
    for (int i = len-1; i >1 ; i--) {//i为当今剩余的无序节点数量
        //因为交换了 那么改变的就是A[0]节点开始 的大根堆--因此此时父节点为0
        buildMaxTree(A,0,i);
        //交换改变
        swap(A[0],A[i-1]);
        //继续上述操作
    }
}
//归并排序--合并有序数组
void merge(int A[],int low,int mid,int high){
    static int B[N];
    for (int i = low; i <= high; ++i) {
        B[i]=A[i];
    }
    int i,j,k;
    for (i = low,j=mid+1,k=low;i<=mid&&j<=high; k++) {
        if (B[i]<B[j]){
            A[k]=B[i++];
        } else{
            A[k]=B[j++];
        }
    }
    //不要忘记还有剩余元素
    while (i<=mid){
        A[k++]=B[i++];
    }
    while (j<=high){
        A[k++]=B[j++];
    }
}
//归并排序
void mergeSort(int A[],int low,int high){
    if (low>=high){
        return;
    }
    int mid=(low+high)/2;
    //归并前半部分
    mergeSort(A,low,mid);
    //归并后半部分
    mergeSort(A,mid+1,high);
    //合并为有序数列
    merge(A,low, mid,high);
}

void printSort(int A[],int len){
    for (int i = 0; i < len; ++i) {
        printf("%3d",A[i]);
    }
}

完整代码 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线下活动线上同步直播?媒体同步直播的好处

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 线下活动线上同步直播&#xff0c;即利用互联网技术将线下活动的实时内容传输到线上平台&#xff0c;供无法到场的观众在线观看。这种直播方式的好处主要体现在以下几个方面&#xff1a;…

010Editor汉化版+下载+注册码+模板bug

项目场景&#xff1a; 这天我想使用我的不知名的一个破解版本的010Edit来查看一个EXE程序&#xff0c;并想使用模板功能&#xff0c;但是发现没有该模板还无法下载最新模板 问题描述 010Edit联网后需要注册码&#xff1a; 010 Editor 激活码生成器 使用方法 参照教程使用0…

AI新晋王者Claude3完胜ChatGPT4?

1 引言 新王即位&#xff1f;ChatGPT 4跌下神坛? 3月4日&#xff0c;OpenAI 的主要竞争对手之一Anthropic发布了最新的Claude 3系列模型&#xff0c;并宣称claude3系列在推理、数学、编程、多语言理解和视觉方面都树立了新的行业基准。Claude家族包括了Claude 3 Haiku, Clau…

pycharm中连接远程服务器

文章目录 概要文件进行映射将本地的project和远程的project进行映射&#xff0c;一定要使用sftp本地文件和远程的位置配置不想将远程的文件同步时候&#xff0c;可以进行下面设置 配置远程服务器的python解释器需要setting-->python interpreter-->add---> on ssh选择…

车规芯片为什么需要信息安全(1)

目录 1.汽车出现过被黑客攻击事件吗&#xff1f; 2.汽车信息安全标准汇总 2.1 国际标准 2.2 国内标准 3.车规芯片的信息安全应该从什么地方考虑 3.1 芯片硬件安全防护能力 3.2 车规芯片的信息安全服务 3.3 芯片厂如何证明芯片的信息安全能力 4.小结 这个来自家里人的灵…

Spring Cloud Gateway自定义断言

问题&#xff1a;Spring Cloud Gateway自带的断言&#xff08;Predicate&#xff09;不满足业务怎么办&#xff1f;可以自定义断言&#xff01; 先看Spring Cloud Gateway是如何实现断言的 Gateway中断言的整体架构如下&#xff1a; public abstract class AbstractRoutePred…

【pycharm使用ssh连接服务器】

2、pycharm使用ssh连接服务器 1、具体流程2、一些需要注意的小问题2.1 更改代码地址2.2 本地代码上传到服务器2.3 在服务器的环境中上新安装库&#xff0c;但是pycharm检测不到 1、具体流程 打开pycharm – File – Setting 输入服务器的IP地址&#xff0c;端口号、登录账号名…

指令调用模板

也就是这边指令通过id和map会定位到一个结构体&#xff0c;然后这个结构再赋值两个成员&#xff0c;一个是函数一个是指令类型&#xff0c;然后这个函数是模板的实例化 使用的时候就传进去&#xff0c;这只是参数&#xff0c;最开始初始化的时候模板就已经实例化了。然后关于模…

嵌入式软件开发工程师如何提高C语言编码技能?

嵌入式软件开发工程师如何提高C语言编码技能&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提升…

[Unity3D]--更换天空盒子

我们原来的天空盒子是这样的。 感觉不是特别满意&#xff0c;想换一个更好看的。 去资源商店找个好看的 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 例如这个 然后在Window>Rendering>Lighting里的环境选项里更换材质 更换&#xff1a; ​ …

【Echarts】柱状图上方显示数字以及自定义值,标题和副标题居中,鼠标上显示信息以及自定义信息

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《前端》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

h5企微插件之WeixinJSBridge、iframe通过cors-anywhere加载微信文章实践

项目背景 公司有一个运营同事使用的素材库&#xff0c;是h5开发的企微插件&#xff0c;原本素材主要是公司域名的文章&#xff0c;点击文章可以进入详情页查看文章内容&#xff0c;并且可以转发客户、群发客户、发朋友圈等。现在希望可以支持非公司域名的文章&#xff0c;主要…

【SpringCloud微服务全家桶学习笔记-GateWay网关(微服务入口)】

Gateway服务网关 API网关为微服务架构中的服务提供了统一的访问入口&#xff0c;客户端通过API网关访问相关服务。API网关的定义类似于设计模式中的门面模式&#xff0c;它相当于整个微服务架构中的门面&#xff0c;所有客户端的访问都通过它来进行路由及过滤。它实现了请求路…

ElasticSearch深度分页问题如何解决

文章目录 概述解决方法深度分页方式from size深度分页之scrollsearch_after 三种分页方式比较 概述 Elasticsearch 的深度分页问题是指在大数据集上进行大量分页查询时可能导致的性能下降和资源消耗增加的情况。这种情况通常发生在需要访问大量数据的情形下&#xff0c;比如用…

二,几何相交---4,BO算法---(2)比较和排序

在某一时刻xt&#xff0c;扫描线从左到右时&#xff0c;一部分线段会与扫描线相交&#xff0c;此时此刻&#xff0c;线段可以分成高低顺序&#xff0c; 那么对于给定两条线段&#xff0c;是如何变化的呢&#xff1f;有两个端点&#xff0c;左端点和右端点&#xff0c; 三种情况…

OpenAI:ChatGPT API 文档之 Embedding

在自然语言处理和机器学习领域&#xff0c;"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称为嵌入空间&#xff08;embedding space&#xff09;&#xff0c;而生成的向量则称为嵌入向量&#xff08;embedding vector&#xff0…

Java项目:47 ssm007亚盛汽车配件销售业绩管理统+jsp(含文档)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 亚盛汽车配件销售业绩管理系统根据调研&#xff0c;确定管理员管理客户&#xff0c;供应商&#xff0c;员工。 管理配件和配件的进货以及出售…

S5PV210_视频编解码项目_裸机开发:实现按键的外部中断处理

加粗样式本文所作内容&#xff1a; 基于S5PV210芯片实现按键的外部中断处理程序&#xff0c;搭建中断处理流程框架 S5PV210对于中断处理的操作流程 1 外部中断得到触发&#xff1a; 1&#xff09;外部中断在初始化阶段得到使能 2&#xff09;外界达到了外部中断的触发条件 …

(4)可执行文件

我们把.o文件链接起来得到可执行文件&#xff0c;然后一开始没有指定函数执行入口&#xff0c;连接器显示如下 这时候我们看最终的可执行文件会发现这个位置是main。也就是说连接器自动帮我们把入口识别为main 所以我们重新用-e main来指定连接器入口为main&#xff0c;再看看 …

李彦宏:程序员职业将不复存在,会说话就能当程序员;ChatGPT 日耗电超 50 万度丨 RTE 开发者日报 Vol.161

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…