十大排序(总结+算法实现)

news2025/8/9 13:02:55

十大排序(总结+算法实现)

十大排队的性能分析

在这里插入图片描述

冒泡排序

使用冒泡排序,时间复杂度为O(n^2),空间复杂度为O(1)

像气泡一样从低往上浮现

vector<int> bubbleSort(vector<int>nums)
{
    int length=nums.size();
    for(int i=0;i<length;i++)
    {
        for(int j=length-2;j>=i;j--)
        {
            if(nums[j]>nums[j+1])
            {
                int temp=nums[j+1];
                nums[j+1]=nums[j];
                nums[j]=temp;
            }
        }
    }
    return nums;
}

选择排序

使用选择排序,时间复杂度为O(n^2),空间复杂度为O(1)。寻找关键字最小的坐标

vector<int>selectSort(vector<int>nums)
{
    int length=nums.size();
    int minPos=INT_MIN;
    for(int i=0;i<length-1;i++)
    {
        minPos=i;
        for(int j=i+1;j<length;j++)
        {
            minPos=nums[j]<nums[minPos]?j:minPos;
        }
        
        int temp=nums[i];
        nums[i]=nums[minPos];
        nums[minPos]=temp;
    }
    return nums;
}

插入排序

使用插入排序,时间复杂度为O(n^2),空间复杂度O(1)

vector<int>insertSort(vector<int>nums)
{
    int length=nums.size();
    for(int i=0;i<length-1;i++)
    {
        //当找到满足非递增的数组时,进行处理
        int temp=nums[i+1];
        int preIndex=i;
        while(preIndex>=0&&nums[preIndex]>temp)
        {
            //数组往后挪,直到找到第一个小于该值的值
            nums[preIndex+1]=nums[preIndex];
            preIndex--;
        }
        nums[preIndex+1]=temp;
        
    }
    return nums;
}

希尔排序

使用希尔排序进行实现,平均时间复杂度为O(nlogn),空间复杂度为O(1)

希尔排序是在插入排序的基础上进行改进的算法

先将序列划分成大区间,先对每一个区间进行排序,使后一个区间里的所有对应位置的值都大于前一个区间所有对应位置的值

然后不断循环,直到最后大区间全部都变成了小区间,则此时代表已经排号序了

vector<int>shellSort(vector<int>nums)
{
    int length=nums.size();
    int gap=length>>1;
    int temp;
    while(gap)
    {
        //类似插入排序
        //i从第二个区间开始的
        for(int i=gap;i<length;i++)
        {
            temp=nums[i];
            int preIndex=i-gap;
             
            while(preIndex>=0&&nums[preIndex]>temp)
            {
                nums[preIndex+gap]=nums[preIndex];
                preIndex-=gap;
            }
            nums[preIndex+gap]=temp;
        }
        gap=gap>>1;
    }
    return nums;
}

归并排序

归并排序,平均时间复杂度O(nlogn),空间复杂度O(n)

//归并排序,平均时间复杂度O(nlogn),空间复杂度O(n)
//使用递归实现归并排序
vector<int>mergeSort(vector<int>nums)
{
    mSort(nums,0,nums.size()-1);
    return nums;
}

//在[left,right]这个区间中进行归并排序,整个nums经过整个函数后就是一个有序数组
//使用回溯的思想
void mSort(vector<int>&nums,int left,int right)
{
    //定义递归终止条件
    if(left>=right)
    {
        return;
    }
    //防止位溢出
    int mid=left+((right-left)>>1);
    //回溯
    mSort(nums,left,mid);
    mSort(nums,mid+1,right);
    merge(nums,left,mid,right);
}


void merge(vector<int>&nums,int left,int mid,int right)
{
    //创建一个临时数组用以保存合并排序之后的数组,并把这个区间的值赋给其
    vector<int>tempArr(nums.begin()+left,nums.begin()+right+1);
    
    //合并两个区间,i代表左边开始索引,j代表右边开始索引
    int i=left;
    int j=mid+1;

    for(int k=left;k<=right;k++)
    {
        //代表左边已经处理完毕,将右边的直接替代即可
        if(i>mid)
        {
            nums[k]=tempArr[j-left];
            j++;
        }
        //代表右边已经处理完毕,将左侧区间的值直接拷贝到原数组即可
        else if(j>right)
        {
            nums[k]=tempArr[i-left];
            i++;
        }
        //两边都未处理完毕,则比较二者大小,将元素中较小的元素放在左边
        else if(tempArr[i-left]<=tempArr[j-left]){
            nums[k]=tempArr[i-left];
            i++;
        }
        else
        {
            nums[k]=tempArr[j-left];
            j++;
        }
    }
}

快速排序

平均时间复杂度为O(nlogn),最坏平均复杂度为O(n^2),空间复杂度O(logn)

vector<int>quickSort(vector<int>nums)
{
    qSort(nums,0,nums.size()-1);
    return nums;
}


void qSort(vector<int>&nums,int left,int right)
{
    //定义递归终止条件
    if(left>=right)
    {
        return;
    }

    //设置枢轴
    int pivot=partition(nums,left,right);
    //递归实现
    qSort(nums,left,pivot-1);
    qSort(nums,pivot+1,right);
}

int partition(vector<int>&nums,int left,int right)
{
    int pivot=nums[left];
    int j=left;

    for(int i=left+1;i<=right;i++)
    {
        //大放过小交换
        if(nums[i]<pivot)
        {
            j++;
            swap(nums,i,j);
        }
    }
    swap(nums,left,j);
    return j;
}

void swap(vector<int>&nums,int index1,int index2)
{
    int temp=nums[index1];
    nums[index1]=nums[index2];
    nums[index2]=temp;
}

堆排序

堆排序,算法平均时间复杂度为O(nlogn),空间复杂度O(1)

vector<int>heapSort(vector<int>nums)
{
    //首先构建一个最大堆
    for(int i=nums.size()/2-1;i>=0;--i)
    {
        heapAdjust(nums,i,nums.size());
    }

//从最大堆中逆序得到递增序列
    for(int i=nums.size()-1;i>=0;--i)
    {
        swap(nums,0,i);
        heapAdjust(nums,0,i);
    }
    return nums;

}

void heapAdjust(vector<int>&nums,int i,int length)
{
    int max=i;
    //构建左右结点
    int lChild=i*2+1;
    int rChild=i*2+2;

    if(lChild<length&&nums[lChild]>nums[max])
    {
        max=lChild;
    }
    if(rChild<length&&nums[rChild]>nums[max])
    {
        max=rChild;
    }
    if(max!=i)
    {
        swap(nums,i,max);
        heapAdjust(nums,max,length);
    }
}

计数排序

计数排序,时间复杂度O(n+k),空间复杂度O(k)

vector<int>countSort(vector<int>nums)
{
   int maxVal=nums[max_element(nums.begin(),nums.end())-nums.begin()];
   int minVal=nums[min_element(nums.begin(),nums.end())-nums.begin()];
   //数值作为索引,个数作为值
   vector<int>count(maxVal,0);

   vector<int>temp(nums);
//数字需要减去1才能实现
   for(int i=0;i<temp.size();i++)
   {
        ++count[nums[i]-1];
   }

   nums.clear();

   for(int i=0;i<count.size();i++)
   {
        for(int j=0;j<count[i];j++)
        {
            nums.push_back(i+1);
        }
   }
   return nums;
}

vector<int>countSort2(vector<int>nums)
{
   int maxVal=nums[max_element(nums.begin(),nums.end())-nums.begin()];
   int minVal=nums[min_element(nums.begin(),nums.end())-nums.begin()];
   //数值作为索引,个数作为值
   vector<int>count(maxVal-minVal+1,0);
    int bias=0-minVal;
   for(int i=0;i<nums.size();i++)
   {
        ++count[nums[i]+bias];
   }

    int index=0,i=0;
    while(index<nums.size())
    {
        if(count[i]!=0)
        {
            nums[index]=i-bias;
            count[i]--;
            index++;
        }
        else{
            i++;
        }
    }

   return nums;
}

桶排序

平均时间复杂度为O(n+k),空间复杂度为O(n+k)

//桶排序  平均时间复杂度为O(n+k),空间复杂度为O(n+k)
//设置总共有5个桶
vector<int>bucketSort(vector<int>nums)
{
   int maxVal=nums[max_element(nums.begin(),nums.end())-nums.begin()];
   int minVal=nums[min_element(nums.begin(),nums.end())-nums.begin()];

   //设置桶的大小
   int bucketSize=5;
   //设置桶的数目
   int bucketCount=(maxVal-minVal)/bucketSize+1;

   vector<vector<int>>buckets(bucketCount,vector<int>());

    //利用映射函数将数据分配到每个桶中
    for(int i=0;i<nums.size();i++)
    {
        buckets[(nums[i]-minVal)/bucketSize].push_back(nums[i]);
    }

    int index=0;
    for(int i=0;i<buckets.size();i++)
    {
        //对每个桶的内部函数进行排序
        //调用之前写的排序算法
        buckets[i]=quickSort(buckets[i]);
    //取出每个桶中的元素
        for(int j=0;j<buckets[i].size();j++)
        {
            nums[index++]=buckets[i][j];
        }
    }
    return nums;
}

基数排序

平均时间复杂度为O(n*k),空间复杂度为O(n+k)

//基数排序,平均时间复杂度为O(n*k),空间复杂度为O(n+k)
//按位对应的数,从高位开始依次比较,进行排序

vector<int>radixSort(vector<int>nums)
{
    int length=nums.size();
    int bits=maxBit(nums);

    //设置数组保存从0~9的数字
   
    int radix=1;
    for(int i=0;i<=bits;i++)
    {

        //获取更新的数组
        vector<int>newArray(length);
        //根据最后一位数字的值保存排序数组
        vector<int>count=vector<int>(10,0);

        for(int j=0;j<length;j++)
        {
            int temp=(nums[j]/radix)%10;
            count[temp]++;
        }

        //计算前缀和,判断前面由于个位数不存在的值
        for(int j=1;j<10;j++)
        {
            count[j]+=count[j-1];
        }
//指定更新阵列的新位置,count[temp]--则是用来判断这个位置是否到位
        for(int j=length-1;j>=0;j--)
        {
            int temp=(nums[j]/radix)%10;
            newArray[count[temp]-1]=nums[j];
            count[temp]--;
        }

        nums=newArray;
        radix*=10;
    }
    return nums;


}

//获取数组中最大值的位数
int maxBit(vector<int>nums)
{
    int maxVal=nums[max_element(nums.begin(),nums.end())-nums.begin()];
    int d=0;
    // int p=10;
    while(maxVal>0)
    {
        maxVal/=10;
        ++d;
    }
    return d;
}

全部测试代码

#include<iostream>
#include<vector>
#include<algorithm>
#include<list>

using namespace std;

void mSort(vector<int>&nums,int left,int right);
void merge(vector<int>&nums,int left,int mid,int right);
void qSort(vector<int>&nums,int left,int right);
int partition(vector<int>&nums,int left,int right);
void swap(vector<int>&nums,int index1,int index2);
void heapAdjust(vector<int>&nums,int i,int length);
int maxBit(vector<int>nums);

//使用冒泡排序,时间复杂度为O(n^2),空间复杂度为O(1)
//像气泡一样从低往上浮现
vector<int> bubbleSort(vector<int>nums)
{
    int length=nums.size();
    for(int i=0;i<length;i++)
    {
        for(int j=length-2;j>=i;j--)
        {
            if(nums[j]>nums[j+1])
            {
                int temp=nums[j+1];
                nums[j+1]=nums[j];
                nums[j]=temp;
            }
        }
    }
    return nums;
}


//使用选择排序,时间复杂度为O(n^2),空间复杂度为O(1)
//寻找到关键字最小的坐标
vector<int>selectSort(vector<int>nums)
{
    int length=nums.size();
    int minPos=INT_MIN;
    for(int i=0;i<length-1;i++)
    {
        minPos=i;
        for(int j=i+1;j<length;j++)
        {
            minPos=nums[j]<nums[minPos]?j:minPos;
        }
        
        int temp=nums[i];
        nums[i]=nums[minPos];
        nums[minPos]=temp;
    }
    return nums;
}

//使用插入排序,时间复杂度为O(n^2),空间复杂度O(1)
vector<int>insertSort(vector<int>nums)
{
    int length=nums.size();
    for(int i=0;i<length-1;i++)
    {
        //当找到满足非递增的数组时,进行处理
        int temp=nums[i+1];
        int preIndex=i;
        while(preIndex>=0&&nums[preIndex]>temp)
        {
            //数组往后挪,直到找到第一个小于该值的值
            nums[preIndex+1]=nums[preIndex];
            preIndex--;
        }
        nums[preIndex+1]=temp;
        
    }
    return nums;
}

//使用希尔排序进行实现,平均时间复杂度为O(nlogn),空间复杂度为O(1)
//希尔排序是在插入排序的基础上进行改进的算法
//先将序列划分成大区间,先对每一个区间进行排序,使后一个区间里的所有对应位置的值都大于前一个区间所有对应位置的值‘
//然后不断循环,直到最后大区间全部都变成了小区间,则此时代表已经排号序了
vector<int>shellSort(vector<int>nums)
{
    int length=nums.size();
    int gap=length>>1;
    int temp;
    while(gap)
    {
        //类似插入排序
        //i从第二个区间开始的
        for(int i=gap;i<length;i++)
        {
            temp=nums[i];
            int preIndex=i-gap;
             
            while(preIndex>=0&&nums[preIndex]>temp)
            {
                nums[preIndex+gap]=nums[preIndex];
                preIndex-=gap;
            }
            nums[preIndex+gap]=temp;
        }
        gap=gap>>1;
    }
    return nums;
}

//归并排序,平均时间复杂度O(nlogn),空间复杂度O(n)
//使用递归实现归并排序
vector<int>mergeSort(vector<int>nums)
{
    mSort(nums,0,nums.size()-1);
    return nums;
}

//在[left,right]这个区间中进行归并排序,整个nums经过整个函数后就是一个有序数组
//使用回溯的思想
void mSort(vector<int>&nums,int left,int right)
{
    //定义递归终止条件
    if(left>=right)
    {
        return;
    }
    //防止位溢出
    int mid=left+((right-left)>>1);
    //回溯
    mSort(nums,left,mid);
    mSort(nums,mid+1,right);
    merge(nums,left,mid,right);
}


void merge(vector<int>&nums,int left,int mid,int right)
{
    //创建一个临时数组用以保存合并排序之后的数组,并把这个区间的值赋给其
    vector<int>tempArr(nums.begin()+left,nums.begin()+right+1);
    
    //合并两个区间,i代表左边开始索引,j代表右边开始索引
    int i=left;
    int j=mid+1;

    for(int k=left;k<=right;k++)
    {
        //代表左边已经处理完毕,将右边的直接替代即可
        if(i>mid)
        {
            nums[k]=tempArr[j-left];
            j++;
        }
        //代表右边已经处理完毕,将左侧区间的值直接拷贝到原数组即可
        else if(j>right)
        {
            nums[k]=tempArr[i-left];
            i++;
        }
        //两边都未处理完毕,则比较二者大小,将元素中较小的元素放在左边
        else if(tempArr[i-left]<=tempArr[j-left]){
            nums[k]=tempArr[i-left];
            i++;
        }
        else
        {
            nums[k]=tempArr[j-left];
            j++;
        }
    }
}



//快速排序:平均时间复杂度为O(nlogn),最坏平均复杂度为O(n^2),空间复杂度O(logn)
vector<int>quickSort(vector<int>nums)
{
    qSort(nums,0,nums.size()-1);
    return nums;
}


void qSort(vector<int>&nums,int left,int right)
{
    //定义递归终止条件
    if(left>=right)
    {
        return;
    }

    //设置枢轴
    int pivot=partition(nums,left,right);
    //递归实现
    qSort(nums,left,pivot-1);
    qSort(nums,pivot+1,right);
}

int partition(vector<int>&nums,int left,int right)
{
    int pivot=nums[left];
    int j=left;

    for(int i=left+1;i<=right;i++)
    {
        //大放过小交换
        if(nums[i]<pivot)
        {
            j++;
            swap(nums,i,j);
        }
    }
    swap(nums,left,j);
    return j;
}

void swap(vector<int>&nums,int index1,int index2)
{
    int temp=nums[index1];
    nums[index1]=nums[index2];
    nums[index2]=temp;
}


//堆排序,算法平均时间复杂度为O(nlogn),空间复杂度O(1)
vector<int>heapSort(vector<int>nums)
{
    //首先构建一个最大堆
    for(int i=nums.size()/2-1;i>=0;--i)
    {
        heapAdjust(nums,i,nums.size());
    }

//从最大堆中逆序得到递增序列
    for(int i=nums.size()-1;i>=0;--i)
    {
        swap(nums,0,i);
        heapAdjust(nums,0,i);
    }
    return nums;

}

void heapAdjust(vector<int>&nums,int i,int length)
{
    int max=i;
    //构建左右结点
    int lChild=i*2+1;
    int rChild=i*2+2;

    if(lChild<length&&nums[lChild]>nums[max])
    {
        max=lChild;
    }
    if(rChild<length&&nums[rChild]>nums[max])
    {
        max=rChild;
    }
    if(max!=i)
    {
        swap(nums,i,max);
        heapAdjust(nums,max,length);
    }
}


//计数排序,时间复杂度O(n+k),空间复杂度O(k)
vector<int>countSort(vector<int>nums)
{
   int maxVal=nums[max_element(nums.begin(),nums.end())-nums.begin()];
   int minVal=nums[min_element(nums.begin(),nums.end())-nums.begin()];
   //数值作为索引,个数作为值
   vector<int>count(maxVal,0);

   vector<int>temp(nums);
//数字需要减去1才能实现
   for(int i=0;i<temp.size();i++)
   {
        ++count[nums[i]-1];
   }

   nums.clear();

   for(int i=0;i<count.size();i++)
   {
        for(int j=0;j<count[i];j++)
        {
            nums.push_back(i+1);
        }
   }
   return nums;
}


//计数排序,时间复杂度O(n+k),空间复杂度O(k)
//优化空间
vector<int>countSort2(vector<int>nums)
{
   int maxVal=nums[max_element(nums.begin(),nums.end())-nums.begin()];
   int minVal=nums[min_element(nums.begin(),nums.end())-nums.begin()];
   //数值作为索引,个数作为值
   vector<int>count(maxVal-minVal+1,0);
    int bias=0-minVal;
   for(int i=0;i<nums.size();i++)
   {
        ++count[nums[i]+bias];
   }

    int index=0,i=0;
    while(index<nums.size())
    {
        if(count[i]!=0)
        {
            nums[index]=i-bias;
            count[i]--;
            index++;
        }
        else{
            i++;
        }
    }

   return nums;
}


//桶排序  平均时间复杂度为O(n+k),空间复杂度为O(n+k)
//设置总共有5个桶
vector<int>bucketSort(vector<int>nums)
{
   int maxVal=nums[max_element(nums.begin(),nums.end())-nums.begin()];
   int minVal=nums[min_element(nums.begin(),nums.end())-nums.begin()];

   //设置桶的大小
   int bucketSize=5;
   //设置桶的数目
   int bucketCount=(maxVal-minVal)/bucketSize+1;

   vector<vector<int>>buckets(bucketCount,vector<int>());

    //利用映射函数将数据分配到每个桶中
    for(int i=0;i<nums.size();i++)
    {
        buckets[(nums[i]-minVal)/bucketSize].push_back(nums[i]);
    }

    int index=0;
    for(int i=0;i<buckets.size();i++)
    {
        //对每个桶的内部函数进行排序
        //调用之前写的排序算法
        buckets[i]=quickSort(buckets[i]);
    //取出每个桶中的元素
        for(int j=0;j<buckets[i].size();j++)
        {
            nums[index++]=buckets[i][j];
        }
    }
    return nums;
}


//基数排序,平均时间复杂度为O(n*k),空间复杂度为O(n+k)
//按位对应的数,从高位开始依次比较,进行排序

vector<int>radixSort(vector<int>nums)
{
    int length=nums.size();
    int bits=maxBit(nums);

    //设置数组保存从0~9的数字
   
    int radix=1;
    for(int i=0;i<=bits;i++)
    {

        //获取更新的数组
        vector<int>newArray(length);
        //根据最后一位数字的值保存排序数组
        vector<int>count=vector<int>(10,0);

        for(int j=0;j<length;j++)
        {
            int temp=(nums[j]/radix)%10;
            count[temp]++;
        }

        //计算前缀和,判断前面由于个位数不存在的值
        for(int j=1;j<10;j++)
        {
            count[j]+=count[j-1];
        }
//指定更新阵列的新位置,count[temp]--则是用来判断这个位置是否到位
        for(int j=length-1;j>=0;j--)
        {
            int temp=(nums[j]/radix)%10;
            newArray[count[temp]-1]=nums[j];
            count[temp]--;
        }

        nums=newArray;
        radix*=10;
    }
    return nums;


}

//获取数组中最大值的位数
int maxBit(vector<int>nums)
{
    int maxVal=nums[max_element(nums.begin(),nums.end())-nums.begin()];
    int d=0;
    // int p=10;
    while(maxVal>0)
    {
        maxVal/=10;
        ++d;
    }
    return d;
}




int main()
{
    vector<int>nums={9,9,2,18,3,7,34,356,5};

    vector<int>res=bubbleSort(nums);
    cout<<"冒泡排序的结果为:";
    for(int i:res)
    {
        cout<<i<<" ";
    }
    cout<<endl;

    res=selectSort(nums);
    cout<<"选择排序的结果为:";
    for(int i:res)
    {
        cout<<i<<" ";
    }
    cout<<endl;


    res=insertSort(nums);
    cout<<"插入排序的结果为:";
    for(int i:res)
    {
        cout<<i<<" ";
    }
    cout<<endl;
    

    res=shellSort(nums);
    cout<<"希尔排序的结果为:";
    for(int i:res)
    {
        cout<<i<<" ";
    }
    cout<<endl;


    res=mergeSort(nums);
    cout<<"归并排序的结果为:";
    for(int i:res)
    {
        cout<<i<<" ";
    }
    cout<<endl;

    res=quickSort(nums);
    cout<<"快速排序的结果为:";
    for(int i:res)
    {
        cout<<i<<" ";
    }
    cout<<endl;


    res=heapSort(nums);
    cout<<"堆排序的结果为:";
    for(int i:res)
    {
        cout<<i<<" ";
    }
    cout<<endl;


    res=countSort2(nums);
    cout<<"计数排序的结果为:";
    for(int i:res)
    {
        cout<<i<<" ";
    }
    cout<<endl;


    res=bucketSort(nums);
    cout<<"堆排序的结果为:";
    for(int i:res)
    {
        cout<<i<<" ";
    }
    cout<<endl;


    res= radixSort(nums);
    cout<<"基数排序的结果为:";
    for(int i:res)
    {
        cout<<i<<" ";
    }
    cout<<endl;
}

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

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

相关文章

PreScan快速入门到精通第三十七讲PreScan中使用深度摄像机

深度相机提供了一个 "相机"图像,其中包含深度值,而不是颜色。它提供的地面真实数据可用于校准或验证立体相机的深度计算。 对象配置 系统选项卡 变量 描述 …

antd——a-tree-select 树形选择控件 与 a-cascader 级联选择器 的对比——技能提升

在遇到 省市区多级联动数据的时候&#xff0c;经常会用到的就是 a-cascader级联选择器。 1.级联选择器的使用方法 1.1 需要指定数据源——options 数据结构是 对象数组嵌套——value/label/children <a-cascader :options"options" placeholder"Please sele…

SpringBoot3 正式发布:有哪些新玩法?

SpringBoot 3.0现已正式发布&#xff0c;可以在Maven Central中找到。 这是自四年前发布2.0以来的第一个主要版本。 它也是SpringBoot的第一个GA版本&#xff0c;提供了对Spring Framework 6.0和GraalVM的支持。 一文详解&#xff5c;从JDK8飞升到JDK17&#xff0c;再到未来…

Tesla M40 下Ubuntu anaconda pycharm安装

显卡&#xff1a;Tesla M40 24GB (2张&#xff09; 显卡驱动版本(推荐)&#xff1a;470.57.02 cuda版本&#xff1a;11.4 安装前需要&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;禁用nouveau驱动&#xff01;&#xff01;&#xff01;&#xff01;&#x…

php中通用的excel导出方法实例

一.普遍导出方法 excel导出的方法网上有很多&#xff0c;在crm或是oa系统中导出excel是常有的事&#xff0c;做过的此功能人都知道&#xff0c;其主要操作其实是循环数据列表&#xff0c;然后一格一格地添加数据到固定的单元格中。只要做好了一次&#xff0c;其后只要复制相关…

外汇天眼:2022 年世界杯已经开始,但这将如何影响外汇交易?

关于 2022 年世界杯 2022年世界杯于2022年11月20日在卡塔尔拉开帷幕&#xff0c;将持续到2022年12月18日。2022年国际足联世界杯是由国际足联成员协会的男子国家队和第22届国际足联世界杯举办的国际足球锦标赛。这是第一次在阿拉伯世界举办的世界杯。 关于中东 尽管经历了疫情…

MCE | KRAS 突变型肺癌耐药性探索

KRAS 是一种致癌基因&#xff0c;编码 KRAS 蛋白 (一种 small GTPase 转导蛋白)。KRAS 通过结合 GTP/GDP 控制其活跃状态&#xff0c;进而控制其信号传递和下游级联反应。致癌性 KRAS 突变会破坏 GTPase 活性&#xff0c;进而使 KRAS 蛋白锁定在活跃状态下&#xff0c;从而使启…

【面试题】JS基础-异步

1. 异步 1.1 为什么要异步&#xff1f; JS是单线程语言&#xff0c;只能同时做一件事。JS和DOM渲染共用同一个线程&#xff0c;因为JS可修改DOM结构。当遇到等待的情况时&#xff0c;例如网络请求、定时任务&#xff0c;程序不能卡住。所以需要异步来解决JS单线程等待的问题&…

学完Spring框架回头再来看反射你会发现真的不一样

文章目录前言一.什么是反射&#xff1f;二.如何实现反射&#xff1f;2.1java.lang.Class2.2通过反射创建对象2.3通过反射获取类成员三.反射的性能四.反射是如何破坏单例模式的&#xff1f;五.如何避免单例模式被反射破坏&#xff1f;前言 你还记得你的Spring入门案例吗&#x…

查询利器—索引

目录 索引的优缺点 常见索引分类 MySQL数据操作的宏观过程 认识磁盘 正式理解索引结构 采用B树的原因 聚簇索引与非聚簇索引 索引操作 索引创建原则 索引的优缺点 优点&#xff1a;提高一个海量数据的检索速度 缺点&#xff1a;查询速度的提高是以插入、更新、删除…

pdf生成:wkhtmltopdf

wkhtmltopdf是开源&#xff08;LGPLv3&#xff09;命令行工具&#xff0c;使用Qt WebKit渲染引擎将HTML渲染为PDF和各种图像格式。这些完全以“headless”模式运行&#xff0c;不需要显示或显示服务wkhtmltoimage。建议&#xff1a; 不要将wkhtmltopdf与任何不受信任的HTML一起…

sqli-labs/Less-61

这一关的欢迎界面提示我们尝试机会为5次 然后要以id为注入点 首先先判断一下是否为数字型 输入id1 and 12 回显如下 所以属于字符型 然后输入1 回显如下 出现了报错信息 说明可以进行报错注入 也说明了注入类型 佐证一下 输入一个1))--回显如下 这道题我还是使用报错注入 首…

使用Python查询国内 COVID-19 疫情

有时我们只是想要一个速的工具来告诉当前疫情的情况&#xff0c;我们只需要最少的数据。 使用Python语言和tkinter图形化显示数据。 首先&#xff0c;我们使用 Tkinter 库使我们的脚本可以图形化显示。 使用 requests 库从 丁香园 获取数据。 然后我们将在这种情况下显示我们…

c# .net+香橙派orangepi 200块多打造自家 浇花助手 系统

由于出差多&#xff0c;这里的花经常过一段时间才能浇水,有些花都旱晕了&#xff0c;所以想做一个助手帮我远程就可以操作浇花&#xff0c;当然也完全可以发展为一个商用系统&#xff0c;拿浇花来做为一个测试平台吧&#xff0c;现在已经完成了&#xff0c;并已经运行了一个多月…

异双功能连接体:Alkyne PEG4 APN,2183440-36-8

一、产品描述&#xff1a; APN-C3-PEG4-炔是一种含有APN部分的异双功能连接体&#xff0c;对半胱氨酸和炔基具有很强的化学选择性。APN半胱氨酸缀合物在水性介质、人血浆和活细胞中的优异稳定性使这种新的巯基点击反应成为生物缀合应用的一种有前景的方法。 APN-C3-PEG4 alkyne…

C语言:关键字----switch、case、default(开关语句)

C语言&#xff1a;基础开发----目录 C语言&#xff1a;关键字—32个(分类说明) 有32个关键字详细说明&#xff0c;还有跳转链接&#xff01; 一、开关语句----介绍 开关语句&#xff0c;包括以下四种关键字&#xff1a; switch&#xff1a;开关语句case&#xff1a; 开关语句…

PHP如何实现订单的延时处理详解

业务需求 订单是我们在日常开发中经常会遇到的一个功能&#xff0c;最近在做业务的时候需要实现客户下单之后订单超时未支付自动取消的功能&#xff0c;刚开始确认了几种方法&#xff1a; 客户端到时间请求取消服务端定时查询有没有需要取消的订单&#xff0c;然后批量处理下…

深度学习入门(五十)计算机视觉——转置卷积

深度学习入门&#xff08;五十&#xff09;计算机视觉——转置卷积前言计算机视觉——转置卷积课件&#xff08;初见转置卷积&#xff09;1 转置卷积2 为什么称之为“转置”课件&#xff08;再谈转置卷积&#xff09;1 转置卷积2 重新排列输入和核形状换算同反卷积的关系总结教…

Android -- 每日一问:Activity的启动模式(launchMode)有哪些,有什么区别?

经典回答 这应该是一道很虐人的面试题&#xff0c;很多人都答不上来&#xff0c;很多人根本就没有用过。当我发现在被我面试的人中有80%的比例对它不了解时&#xff0c;我找过一些同事讨论是否还有在面试中考查这个问题的必要&#xff0c;得到的回答是“程序员何苦为难程序员”…

网络面试题总结

IO协议 问题一:如何理解IP的不可靠和无连接 不可靠:指的是不能保证数据包能成功地到达目的地。发生错误的时候,丢弃该数据包,发送ICMP消息给信源端。可靠性由上层提供。无连接: :IP 不维护关于后续数据报的状态信息。 体现在,IP 数据可以不按顺序发送和接收。A 发送连续…