八个常用排序

【C++】学习笔记[二十一] 文章目录STL常用算法【排序、拷贝和替换】1、sort2、random_shuffle3、merge4、reverse5、copy6、replace7、replace_if8、swap STL常用算法【排序、拷贝和替换】 1、sort 对容器内元素进行排序 练习代码: #include <iostream> #include <vector> #include <string> #include <algorithm> #include <funct 阅读详情

一、插入排序

1.1 直接插入排序

直接插入排序算法的原理如下

插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程。

public class InsertionSort {
    public static void main(String[] args) {
        int arr[]={3,9,-1,10,-2};

        int i,j,temp;

        for( i=1;i< arr.length;i++){
            if(arr[i]<arr[i-1]){ //前有序表的最后一个元素
                // 大于后一个无序表中元素,要把此元素插入到前面有序表,使其依然有序
                temp=arr[i]; // 后续需要移位,故A[i]会被破坏,要暂存A[i]
                for (j=i-1;j>=0 && arr[j]>temp;j--){ //有序表从后往前遍历
                    arr[j+1]= arr[j]; // 所有大于temp的元素都后移一位
                }
                arr[j+1]=temp; // 复制到插入位置
                        // 如果在for循环中声明j,此操作就会出错
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

1.2 直接插入排序(优化 利用折半查找-找到要插入的位置)

public class BInsertionSort {
    public static void main(String[] args) {
        int arr[]={3,9,-1,10,-2};

        int i,j,temp,low,high,mid;

        for( i=1;i< arr.length;i++){
            if(arr[i]<arr[i-1]){ //前有序表的最后一个元素
                // 大于后一个无序表中元素,要把此元素插入到前面有序表,使其依然有序
                temp=arr[i]; // 后续需要移位,故A[i]会被破坏,要暂存A[i]

                low=0;
                high=arr.length-1;
                                    // 最后要查找后 指针 high在low左边一位
                while (low<=high){  // 找到要插入的位置,[low,i-1]全部后移
                    mid=(low+high)/2;
                    if (arr[mid]<temp){
                        low=mid+1;
                    }else {
                        high=mid-1;
                    }
                }

                for (j=i-1;j>=low ;j--){ //有序表从后往前遍历 low==high+1
                    arr[j+1]= arr[j]; // 所有大于temp的元素都后移一位
                }
                arr[j+1]=temp; // 复制到插入位置
                // 如果在for循环中声明j,此操作就会出错
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

2 希尔排序

(先追求局部有序,再逼近全局有序—增量d不断变小)

希尔排序算法的原理如下:

先将待排序表分割成若干形如 L [ i,i+d,i+2d,…,i+kd ]的“特殊”子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止。

2.1 交换法 (先分组后冒泡)

此方案比直插还慢
代码如下:

public class ShellSort {
    public static void main(String[] args) {
        int arr[]={3,9,-1,10,-2,5,6,2,5,7,8};

        int i,j,d,temp;  // d表示步长
        for(d=arr.length/2;d>=1;d/=2){  // 初始的步长为数组的一半,后面不断减半
            for (i=d;i< arr.length;i++){ //d+1从子表的第二个开始比较插入
            // 遍历各组中所有的元素,步长为d
               for (j=i-d;j>=0 ;j-=d){ 
               		// 如果当前元素大于加上步长后的那个元素,说明交换
               		if(arr[j]>arr[j+d]){
               			temp=arr[j];
               			arr[j]=arr[j+d];
               			arr[j+d]=temp;
               		}  
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

2.2 移位法 (先分组后直插)

代码如下:

public class ShellSort {
    public static void main(String[] args) {
        int arr[]={3,9,-1,10,-2,5,6,2,5,7,8};

        int i,j,d,temp;  // d表示步长
        for(d=arr.length/2;d>=1;d/=2){  // 初始的步长为数组的一半,后面不断减半
            for (i=d;i< arr.length;i++){ //d+1从子表的第二个开始比较插入
                if (arr[i]<arr[i-d]){       // i++是不断切换子表操作
                    temp=arr[i];            // 直接插入排序
                    for (j=i-d;j>=0 && arr[j]>temp;j-=d){
                        arr[j+d]=arr[j];
                    }
                    arr[j+d]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

二、交换排序

1、冒泡排序

(每趟中两两对比-可能交换,把最值放到一端)

冒泡排序算法的原理如下:

1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一(随趟数增加每趟找到的最大或最小不再参与排序)个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
5、优化:通过表示变量flag,在进入交换后改变其值,如果flag值没有改变则标志没有数据交换(已排序好)

含标识变量优化

public class BubbleSort {
    public static void main(String[] args) {
        int arr[]={3,9,-1,10,-2};
		int temp=0; // 临时变量
        boolean flag=false; // 标识变量,表示是否进行过交换

        for(int i= arr.length-1;i>=0;i--){

            for (int j=0;j< i;j++){
                // 如果前面比后面的小则交换
                if(arr[j]<arr[j+1]){
                    flag=true; // 进入过交换则把标识变量赋值为true

                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
            if(flag==false){ // 在此趟排序中一次交换都没有发生过
                break;
            }else {
                flag=false; // 如果交换,重置flag,进行下趟判断是否交换
            }

        }
        System.out.println(Arrays.toString(arr));
    }
}

2、快速排序(分治策略)

双指针快速排序基本原理:

1、设置两个变量 low、high,排序开始时:low=0,high=size-1。
2、整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面

2.1)默认数组的第一个数为基准数据,赋值给key,即key=array[low]。
2.2)因为默认数组的第一个数为基准,所以从后面开始向前搜索(high–),找到第一个小于key的array[high],就将 array[high] 赋给 array[low],即 array[low] = array[high]。(循环条件是 array[high] >= key;结束时 array[high] < key)
2.3)此时从前面开始向后搜索(low++),找到第一个大于key的array[low],就将 array[low] 赋给 array[high],即 array[high] = array[low]。(循环条件是 array[low] <= key;结束时 array[low] > key)
2.4)循环 2-3 步骤,直到 low=high,该位置就是基准位置。
2.5)把基准数据赋给当前位置。

3、第一趟找到的基准位置,作为下一趟的分界点。

4、递归调用(recursive)分界点前和分界点后的子数组排序,重复2.2、2.3、2.4的步骤。

5、最终就会得到排序好的数组。

public class QuickSort {
    public static void main(String[] args) {
        int arr[]={3,9,-1,10,-2,5,6,2,5,7,8};
        Quicksort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

    public static void Quicksort(int arr[],int low,int high){
        if (low<high){
            int keypos=Partition(arr,low,high);  //获取划分最后key的索引位置
            Quicksort(arr,low,keypos-1);    // 递归划分key索引左表
            Quicksort(arr,keypos+1,high);   // 递归划分key索引右表
        }
    }


    public static int Partition(int arr[],int low ,int high){
        int key=arr[low]; // 保存第一个元素作为基准
        while (low<high){
            while (low<high && arr[high]>=key){
                high--;
            }
            // 出现比key小的数,将其移到左边
            arr[low]=arr[high];  //因为arr[low]已经保存下来,可以被覆盖

            // 左右两边来回切换

            while (low<high && arr[low]<key){
                low++;
            }
            // 出现比key大的数,将其移到右边
            arr[high]=arr[low]; //因为arr[high]已经被上述arr[low]保存下来,
                                // 可以被覆盖
        }
        // 大循环的停止时是 --- low==high
        arr[low]=key;  // 把基准赋给到最终low/high的位置

        return low;  // 返回当前位置,以便后面递归分组
    }
}

单指针快速排序基本原理:

出现小的移动指针,大的则不移动,故当出现小的时,mark移动到大于基准的索引位置,然后与现在的值arr[i]交换,使得小的值移到前面,大的值移到后面,最后基准与mark位置交换,并返回mark指针对应的索引位置,以便后续递归划分左右表。

public class QuickSort {
    public static void main(String[] args) {
        int arr[]={3,9,-1,10,-2,5,6,2,5,7,8};
        Quicksort2(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    
    public static void Quicksort2(int arr[],int low,int high){
        if (low<high){
            int keypos=partition2(arr,low,high);  //获取划分最后key的索引位置
            Quicksort2(arr,low,keypos-1);    // 递归划分key索引左表
            Quicksort2(arr,keypos+1,high);   // 递归划分key索引右表
        }
    }
	
	// 单边循环 单指针快排
    public static int partition2(int[] arr ,int low ,int high){
        int pivot = arr[low]; // 取第一个元素为基准
        int mark = low;
        for (int i=low+1;i<=high;i++){
            if(arr[i]<pivot){  // 出现小的移动指针,大的则不移动,故当出现小的时,mark移动到大于基准的索引位置,然后与现在的值arr[i]交换,使得小的值移到前面,大的值移到后面,最后基准与mark位置交换,并返回mark指针。
                mark++;
                int temp=arr[mark];
                arr[mark]=arr[i];
                arr[i]=temp;
            }
        }
        // mark与一开始基准元素交换,确定新基准
        arr[low]=arr[mark];
        arr[mark]=pivot;
        return mark;
    }

三、选择排序

1、简单选择排序

(每趟对比起始位置和后续的值,得到后续中最小的值与起始位置交换【可能最小的就是起始位】)

选择排序算法的原理如下:

工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

1、选择排序一共有数组大小-1论排序
2、每一轮排序,又是一个循环,循环的规则(代码)
2.1 先假定当前这个数是最小数
2.2 然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标
2.3 当遍历到数组的最后时,就得到本轮最小数和下标
2.4 交换当前数和最小数(代码)
重复以上操作

public class SelectionSort {
    public static void main(String[] args) {
        int arr[]={3,9,-1,10,-2};

        for (int i=0 ;i<arr.length;i++){
            int min=i;  // 临时变量 存放临时最小值的的索引
            for(int j=i+1;j< arr.length;j++){ // 从当前数的下一个开始遍历
                if(arr[j]<arr[min]){  // 遍历得到最小值的索引
                    min=j;
                }
            }
            if(min!=i){
                swap(arr,i,min); //如果遍历后 最小值的索引改变,
                        // 则交换当前i索引对应的值和遍历得到最小值索引的最小值
            }
        }
        System.out.println(Arrays.toString(arr));
    }

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

2、堆排序

堆的概述:
若n个关键字序列L[1…n] 满足下面某一条性质,则成为堆(Heap):
① 若满足:L(i) >= L(2i) 且 L(i) >= L(2i+1) (1 <= i <= n/2)—大根堆(大顶堆)
② 若满足:L(i) <= L(2i) 且 L(i) <= L(2i+1) (1 <= i <= n/2)—小根堆(小顶堆)

建立大根堆:
思路:把所有非终端结点都检查一遍,是否满足大根堆的要求,如果不满足,则进行调整。如果小于左右孩子,把两个中更大的与其交换
注意:当前结点处理后,更小的元素下坠,可能导致下一层子树不符合大根堆的要求,故需要继续往下调整。
在顺序存储的完全二叉树中,非终端结点编号i<=n/2 —向下取整。

建立大根堆(代码)

	// 建立大根堆
	public static void BuildMaxHeap(int arr[],int len){
        // arr元素索引是从0开始的,所以最后一个非终端结点len/2-1
                                    // ---即arr.length/2-1
        for(int i=len/2-1;i>=0;i--){  // 从后往前遍历调整所有非终端结点
            HeadAdjust(arr,i,len);    //调整堆
        }
    }
	
	// 把数组调整为大根堆
    // k代表非终端结点 ,len代表树中元素的个数(数组的长度)
    public static void HeadAdjust(int arr[],int i,int len){
        int temp=arr[i];  // temp暂存子树的根结点,后续可能被交换
        for (int k=2*i+1;k<len;k=2*k+1){
            // //2*i+1为左子树i的左子树(因为i是从0开始的),2*k+1为k的左子树
            // 沿值较大的子结点向下筛选
            if (k+1<len && arr[k]<arr[k+1]){  //如果有右子树,并且右子树大于左子树
                k++;    // 取到当前非终端结点的左右孩子值最大对应的索引
            }
            if (temp>=arr[k]){
                break;      // 根结点比左右孩子中最大的都大,不用交换,结束循环
            }else {   // 如果小于最大的就要交换
                arr[i]=arr[k];  // 把当前结点的左右孩子中最大的赋给当前结点
                i=k;    // 当前结点的值下坠,可能导致下层不满足大根堆,
                    // 因此从被交换的孩子索引(交换后当前结点对应的位置),继续向下筛选
            }
        }
        arr[i]=temp; // 最后把当前结点的值赋给最后k停留的位置
    }

堆排序:(代码如下)

每一趟将堆顶元素加入有序子序列(与待排序序列中的最后一个元素交换),并将待排序元素序列再次调整为大根堆(小元素不断“下坠”)

public static void Heapsort(int arr[],int len){
        BuildMaxHeap(arr,len);          // 初始建堆
        for (int i=len-1;i>0;i--){        // n-1趟交换和建堆过程
            swap(arr,0,i);          // 堆顶元素索引0和堆底元素交换
            HeadAdjust(arr,0,i); // 把剩余的待排序元素整理成大根堆
             // 索引0位置的最大值被换到i(len-1),剩余[0,len-1]调整为大根堆
        }
    }

    /**
     * 交换元素
     * @param arr
     * @param a 元素的下标
     * @param b 元素的下标
     */
    public static void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

四、归并排序

分治策略,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

归并操作的工作原理如下:

1、创建一个辅助数组,使其大小为原序列的长度,该空间用来存放合并后的序列

2、递归划分左右序列–直到每个左右只有一个元素

3、执行合并操作
3.1)设定两个指针i、j,最初位置分别为两个序列的起始位置low、mid+1
3.2)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3.2直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾

代码如下:

public class MergeSort {
    public static void main(String[] args) {
        int arr[]={3,9,-1,10,-2,5,6,2,5,7,8};
        int[] temp = new int[arr.length]; //创建辅助数组
        Mergesort(arr,0,arr.length-1,temp);
        
        System.out.println(Arrays.toString(arr));
    }

    public static void Mergesort(int arr[],int low,int high,int temp[]){
        if (low<high){
            int mid=(low+high)/2;           // 从中间划分
            Mergesort(arr,low,mid,temp);   // 递归对左半部分划分归并排序
            Mergesort(arr,mid+1,high,temp); // 递归对右半部分划分归并排序
            Merge(arr,low,mid,high,temp); // 把当前划分后的元素,归并排序
        }
    }

    /*
    * arr:排序的原始数组
    * low:初始索引
    *  mid:中间索引
    *  high:最后索引
    *   temp:中转数组
    * */
    public static void Merge(int arr[] ,int low,int mid ,int high,int temp[]){
        int i,j,k; // i(low):左边有序序列的初始索引
                    // j(mid+1):右边有序序列的初始索引
                    // k:指向temp数组的当前索引
        for (k=low;k<=high;k++){  //把原数组的元素复制到temp数组中
            temp[k]=arr[k];
        }
        for (i=low,j=mid+1,k=i;i<=mid && j<=high ;k++){
            if (temp[i]<temp[j]){
                arr[k]=temp[i++];  // 将较小的值重新赋给arr数组
            }else {
                arr[k]=temp[j++];
            }
        }
        // for循环结束是由于其中一个子序列归并完,故需要把另一个剩余部分归并到尾部
        while (i<=mid) arr[k++]=temp[i++];
        while (j<=high) arr[k++]=temp[j++];
    }
}

五、基数排序

基数排序是效率高的稳定性的排序,是桶排序的扩展。

基数排序基本思想

将所有待比较数值统一为同样的数位长度,数位较短的前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。(LSD—最低为优先)
1)首先要得到最大数,确定最大数是几位数
2)定义一个二维数组,表示10个桶(每位取值范围0-9),每个桶就是一个一维数组,同时要定义一个一维数组来记录每个桶中存放数据的个数。在每轮大循环过后,都需要把其置为0
3)通过循环从个位到百位放入桶中,再依桶的顺序取出存放再每个桶中的数据,存到原始数组中(覆盖)。
特别注意:每一轮处理后,要把每个桶中存放数据的个数置零,bucketElementCounts[k]=0 !!!

public class RadixSort {
    public static void main(String[] args) {
        int arr[]={53,3,542,748,14,214};
        radixSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    // 基数排序
    public static void radixSort(int[] arr){

        // 1、得到数组中最大数的位数
        int max=arr[0]; // 假定第一个数就是最大的数
        for (int i=1;i< arr.length;i++){
            if (arr[i]>max){
                max=arr[i];
            }
        }
        // 得到最大数是几位数
        int maxLength=(max + "").length();

        //定义一个二维数组,表示10个桶,每个桶就是一个一维数组
        // 说明
        // 1、二维数组包含10个一维数组
        // 2、防止在放入数的时候,数据溢出,每个一维数组(桶),大小定为arr.length
        // 3、故可以看出,基数排序是使用空间换时间的经典算法
        int[][] bucket = new int[10][arr.length];

        // 为了记录每个桶中,实际存放多少数据,定义一个一维数组来记录每个桶的数据个数
        // 例如 bucketElementCounts[0]记录就是bucket[0]桶中数据个数
        int[] bucketElementCounts = new int[10];


        // 使用循环处理
        for (int i=0,n=1 ;i<maxLength;i++,n*=10){ // 数取模用到 n
            // 针对每个元素对应的位进行排序,个、十、百。。。
            for (int j=0 ;j< arr.length;j++){
                // 去除每个元素的对应位的值
                int digitofElement = arr[j] / n % 10;
                // 放入到对应的桶中   bucketElementCounts[digitofElement]默认0,即桶下标0存第一个数据
                bucket[digitofElement][bucketElementCounts[digitofElement]] = arr[j];
                bucketElementCounts[digitofElement]++;   // 记录的是每个桶存数据的个数
            }

            // 按照桶的顺序(一维数组的下标依次取出数据,放入原来数组)
            int index = 0;
            // 遍历每一个桶,并将桶中数据,放回原数组
            for(int k=0 ;k< bucketElementCounts.length;k++){
                //如果桶中有数据,我们才放入到原数组
                if (bucketElementCounts[k]!=0){  // 不为0,即存入了和数据
                    //循环该桶即第k个桶(即第k个一维数组)
                    for (int l=0;l< bucketElementCounts[k];l++){
                        // 取出元素放入到arr
                        arr[index++]=bucket[k][l];
                    }
                }
                // 每一轮处理后,要把每个桶中存放数据的个数置零,bucketElementCounts[k]=0 !!!
                bucketElementCounts[k]=0;
            }
        }
    }
}
从FSI到三层堆叠:一文搞懂车载CIS图像传感器技术演进与选型避坑 本文深入解析车载CIS图像传感器从FSI到三层堆叠的技术演进,揭示不同结构在低光性能、HDR表现和温度稳定性上的关键差异。通过实测数据对比,指导智能驾驶系统选型策略,帮助开发者规避成本与性能的常见陷阱,提升车载摄像头在复杂环境下的成像质量。 阅读详情

相关推荐

从零到一:手把手教你用C# WinForms搭建工控上位机(含Panel控件布局与事件处理详解)

本文详细介绍了如何使用C# WinForms框架从零开始搭建工控上位机系统,重点讲解了Panel控件的布局技巧和事件处理机制。通过实战案例,帮助开发者掌握界面分区规划、动态窗体切换及数据通信等核心功能,适用于工业自动化监控系统的开发。

weixin_30321709的博客 607

十大排序算法--C++实现(上)

选择排序 插入排序 希尔排序 冒泡排序 通过不断改善局部的有序性实现整体的有序:从前向后依次检查每一对相邻元素,一旦发现逆序即交换二者的位置。对于长度为n的序列,共需做n - 1次比较和不超过n - 1次交换,这一过程称作一趟扫描交换。每一趟扫描交换下来之后,排在最右的元素就会是最大的数。 程序示例: ​void bubblesort1A(int...

ttdss12345678的博客 269

蓝牙6.0的‘新雷达’:Channel Sounding信道探测,真能比UWB更香吗?

本文探讨了蓝牙6.0的Channel Sounding信道探测技术在室内定位领域的应用潜力。通过与UWB技术的对比分析,揭示了其在成本、功耗和兼容性方面的优势,特别是在智能门锁、物品追踪等场景中的商业价值。Channel Sounding技术不仅具备亚米级精度,还能通过现有蓝牙设备实现零边际成本部署,为物联网应用提供了新的解决方案。

weixin_29288313的博客 332

对于一个基本有序的数组进行排序

十分简单,所以仅作个人记录用快排肯定不好,因为他的原理是选定一个值,然后使得他的左边的数都比他小,右边的数都比他大假定 1 2 3 4 5 100 6 7 8 200 9可以考虑增强型冒泡毫无疑问在第一次遍历的时候结果是这样的1 2 3 4 5 6 7 8 100 9 200然后如果是普通冒泡的话,我们下一个将从2开始,所以我们需要修改这个算法我们的目标就是定位到8,然后下一次从8开始遍历怎么定位...

qq_36523667的博客 1万+

Excel VBA--按某一列拆分数据到多个文件

首先,将需要拆分的sheet命名为“明细”,接下来运行此代码,按提示操作即可。 在这里插入代码片 Sub chaifen() '定义变量类型 Dim sht, sh1, sh2 As Worksheet Dim k, i, j As Integer Dim irow As Integer Dim col As Integer Dim str As String '程序开始是要求输入按哪一列拆分数...

weixin_43650026的博客 5871

解密GPT-5-Codex CLI安全最佳实践:从API Key保护到沙箱模式详解

本文深入解析GPT-5-Codex CLI在企业环境中的安全最佳实践,涵盖API Key全生命周期管理、沙箱模式配置及网络传输加固等核心防护策略。通过分层存储方案、动态环境变量加载和精细化权限设计,帮助开发团队构建企业级AI编程助手的安全防线,有效预防密钥泄露和未授权访问风险。

weixin_29309785的博客 585

部分有序数组就地排序,要求时间复杂度为O(n)

数组al[0...mid-1]和al[mid...n-1]两个部分都已经分别排好序。要求合并使得整个数组al有序。请给出合并merge的代码。要求空间复杂度为O(1),时间复杂度O(n)。 思路:可以使用归并排序的思想,不过这里要求空间复杂度为O(1),所以可以转换为一个循环有序数组和一个有序数组的归并; 1,i,j分别指向带合并的两个数组的首元素,初始值i=0;j=mid;l1,l2代表待合

775

告别WSL!实测AMD ROCm7预览版在Windows下跑ComfyUI,速度提升与避坑全记录

本文详细记录了在Windows原生环境下部署AMD ROCm7+PyTorch+ComfyUI的全流程,相比WSL环境性能显著提升。涵盖硬件兼容性确认、开发环境配置、Python环境搭建、ComfyUI部署优化及性能对比测试,为AI绘图爱好者提供实用指南。

weixin_42528090的博客 668

数据结构初学--关于SHELL排序的一些思考

希尔排序(shell sort)是D.L.Shell于1959年提出的一种排序算法。希尔排序:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2...

wlhdsdg的博客 245

【AI智能体】Langchain 主流大模型调用与对话API使用详解

【AI大模型】Langchain 模型调用与对话API使用详解

congge_study的博客 404

自私兽群优化器(SHO)详解:从生物本能到智能优化

自私兽群优化器(SHO)是一种受动物群体自私行为启发的智能优化算法。该算法模拟动物在捕食威胁下的两种行为:聚集行为(全局搜索)和自私行为(局部搜索),将优化问题的解空间映射为生存环境,候选解视为猎物个体。SHO通过安全性评估将猎物分为安全、危险和高危三类,分别采用不同的位置更新策略,并引入捕食者角色增加选择压力。相比传统优化算法,SHO具有无需梯度信息、自适应平衡探索与开发、参数简单等优势,特别适合高维复杂和多模态优化问题。算法通过马尔可夫链理论保证收敛性,已在工程设计和数据挖掘等领域展现出良好性能。

qq_42212808的博客 196

23.10.26 排序的基本概念 插入排序

给定一组记录序列{r1,r2,...,rn},其相应的关键字序列为{k1,k2,...kn},将这组记录排成顺序为{rs1,rs2,...rsn}的一个序列,使得相应关键字满足ks1=ksn,此过程称为排序就是指将一个记录的任意序列重新排列成一个按关键字有序的序列。在排序过程中,将待排序的记录序列扫描一遍称为。如果待排序序列中,存在多个具有相同关键字的记录,在排序后,若这些记录的相对次序保持不变,则称这种排序是;否则是。

m0_66946793的博客 192

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

常用八个排序算法性能总结

常用八个排序算法性能比较

菜鸟502的博客 429

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

理解常用的八个排序

文章目录排序的概念及其运用排序的概念排序运用常见的排序算法插入排序希尔排序选择排序堆排序冒泡排序快速排序左右指针法三数取中法挖坑法前后指针法小区间优化法非递归实现快排归并排序非递归实现内排序与外排序计数排序 排序的概念及其运用 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序

aaaaaaaWoLan的博客 1646

八个常用排序算法

八个常用排序算法 冒泡排序 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。 publicclassbubbleSort{ publicbubbleSort(){ inta[]...

weixin_44720180的博客 309

八个常用排序Java实现

插入排序 时间复杂度 平均 O(n^2) 最好 O(n) 最坏 O(n^2) 空间复杂度 O(1) 稳定 public void insertSort(int[] arr) { int value, j; for (int i = 1; i < arr.length; i++) { value = arr[i]; for (j = i - 1; j >= 0 && value < arr[j];

qq_44919610的博客 408

Java如何实现八个常用的排序算法

转载:http://www.jb51.net/article/70396.htm 这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序,分享给大家一起学习。 分类 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(基数排序)

Ajian_Dianye的博客 383

Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等

import java.util.Arrays; /* * 实现了八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 * 以及快速排序、归并排序、堆排序和LST基数排序 * @author gkh178 */ public class EightAlgorithms { //插入排序:时间复杂度o(n^2) public static void i

畅游JAVA 309

c++语言编程希尔排序法排序,C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等...

本文实现了八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序首先是算法实现文件Sort.h,代码如下:/** 实现了八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序* 以及快速排序、归并排序、堆排序和LST基数排序* @author gkh178*/#include templatevoid swap_value(T &a,T...

weixin_33474071的博客 292

java语言冒泡排序法_Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等...

本文实现了八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序首先是EightAlgorithms.java文件,代码如下:import java.util.Arrays;/** 实现了八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序* 以及快速排序、归并排序、堆排序和LST基数排序* @author gkh178*/public cl...

weixin_42311046的博客 145

【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序

这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序,需要的朋友可以参考下 本文实现了八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序 首先是EightAlgorithms.java文件,代码如下: import java.util.Arr

小坚的技术博客 1150

开发人员常用linux命令分类,开发人员常用什么linux命令

Linux命令很丰富,有些人很头疼。那么开发人员常用什么linux命令呢?下面跟着学习啦小编来一起了解下吧。开发人员常用linux命令注意:下面的每个命令都有十分丰富的文档说明。这篇文章并不是来详尽的展示每个命令的各种功用的。我在这里要讲的是这几个最常用的命令的最常见用法。如果你对linux命令并不是很了解,你想找一些这方面的资料学习,那这篇文章将会给你一个基本的指导。让我们从处理一些数据开始。假...

weixin_39608394的博客 136

SHELL脚本之常用文本处理命令③

本文介绍了文本处理命令中的cut、sort、uniq、wc、tee、xargs、join、tr的作用和用法

阿玮的博客 422

numpy部分函数实例

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

erjia_的博客 310

算法笔记--八个常见排序算法总结

一、 分类描述 1. 插入排序 直接

ltxdzh's blog 572

数据结构——排序算法总结(八个)

内排序:指在排序期间数据对象所有存放在内存的排序。外排序:指在排序期间所有对象太多,不能同一时候存放在内存中,必须依据排序过程的要求,不断在内,外存间移动的排序。

qq_34252068的博客 7955
上一篇: 递归-八皇后
下一篇: 查找算法-
AX_Chu
博客等级 码龄6年 13粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值