插入排序,选择排序,交换排序,归并排序和非比较排序(C语言版)
前言
所谓排序,就是将一组数据按照递增或者递减的方式进行排列,让这组数据变得有序起来。排序在生活中运用的是十分广泛的,各行各业都用到了排序,比如我们在网购的时候就是按照某种排序的方式来选择东西的。所以去了解排序的实现也就是很重要的了。
目录
1.排序的概念
2.常见的排序算法
3.常见的排序算法的实现
3.1插入排序
3.1.1直接插入排序
3.1.2希尔排序
3.2选择排序
3.2.1堆排序
3.2.2直接选择排序
3.3交换排序
3.3.1冒泡排序
3.3.2快速排序
3.4归并排序
3.4.1归并排序
3.4.2归并排序应用-外排序
3.5非比较排序
4.排序算法的复杂度及稳定性的分析
1.排序的概念
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小按照一定的规律变成递增或者递减的序列。
稳定性: 假定待排序的记录序列中,存在多个具有相同关键字的记录,经过排序后这些记录的相对次序没有发生变化,即在原序列中r[i] = r[j],且r[i]在r[j]之前,而在排序后r[i]任在r[j]之前,则称这种排序算法是稳定的,否则就是不稳定的。
内排序:数据元素全部放在内存中的排序。
外排序:数据元素太多不能同时放在内存中,根据排序过程中的要求能在内外存之间移动数据的排序。
2.常见的排序算法
3.常见的排序算法的实现
3.1插入排序
基本思想:把待排序的记录按其关键码值逐个插入到一个已经排好序的有序序列中,直到所有的序列插完为止,得到一个新的有序序列。
实际上我们在玩扑克排的时候,就用到了插入排序的思想。
3.1.1直接插入排序
当插入第i个元素的时候前面的array[0],array[1],…,array[i-1]已经排好序,此时用arryy[i]的排序码与array[i -1],array[i-2],array[i-3],...的排序码顺序比较找到插入的位置即将array[i]插入,原来位置上的元素顺序后移。
比较过程,如果是排升序,先与当前值比较,如果比当前值小就和当前值的前一个元素比较,如果比当前值的前一个元素大,就插入到当前值的前一个元素的后面,如果比当前值的前一个元素小,继续去前面进行比较,知道找到合适的位置进行插入,如果是最小的,那么就要插入到数组的开头。如图:
void InsertSort(int* a, int n)//升序排序
{assert(a);for (int i = 0; i < n - 1; ++i){int end = i;int tmp = a[end + 1];//保存数据,后面移动的时候数据会被覆盖while (end >= 0){if (a[end] > tmp){a[end + 1] = a[end];//将数据向后移动空出位置--end;//迭代继续向前比较}else{break;//插入到}}a[end + 1] = tmp;}
}
直接插入排序的特性总结:
1.时间复杂度为O(N*2)。
2.排序的序列越接近有序,时间复杂度越低。
3.稳定性:稳定。
4.空间复杂度O(1),它是一种稳定的排序。
实现代码:
3.1.2希尔排序
希尔排序又称缩小增量排序法。希尔排序的基本思想是:先选定一个整数,把待排序的文件中所记录分成一个个组,所有距离为gap的记录在一个组内,并对每一组内的记录进行排序。然后,重复上述分组和排序的工作。当gap = 1时,所以记录统一排好序。
说白了,希尔排序从直接插入排序找突破口,虽然直接插入排的时间复杂度很高,但是直接插入排序在有序或者接近有序的情况下,效率会是很好的,那么怎么样让它接近有序呢?这就要采用预排序了。通过预排序让数组接近有序,最后一次在进行直接插入排序,就会很快,通过这样的方式 希尔排序对直接插入排序进行了很好的优化。
希尔排序分为两步:
1.对数组进行预排序
将数组按照间隔gap分为很多组,先对间隔为gap的组进行排序,使得间隔为gap的是有序的,然后缩小间隔gap。在重复上述过程。
2.直接插入排序
当gap等于1时,就相当于是直接插入排序啦,听起来是不是很简单啊,hhhh。
如图:
//希尔排序
void ShellSort(int* a, int n)
{assert(a);//确保指针不为空int gap = n;while (gap > 1){gap = gap / 3 + 1;//保证最后一次排序的间隔是1,进过计算gap按照三分之一减少是最优的for (int i = 0; i < n - gap; ++i)//排升序{int end = i;int tmp = a[end + gap];//防止数据被覆盖while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];//移动数组,继续在前面比较end = end - gap;}else{break;}}a[end + gap] = tmp;//将数据插入到数组中}Print(a, 10);printf(" gap = %d\n", gap);printf("\n");}}
希尔排序的特性总结
1.希尔排序是对直接插入排序的优化。
2. 当gap大于1的时候都是预排序,目的是让数组更接近有序。当gap == 1时,数组已经接近有序了,这样就可以很快的排出来了。这样的话整体而言可以达到优化的效果。我们实现后可以进行性能测试的对比。
3.希尔排序的时间复杂度不好计算,因为gap的取值有很多方法,导致很难去计算,因此在很多书里面希尔排序的时间复杂度都不固定。
因为这里的gap是按照Knuth的方法取值的,所以暂时按照来计算。
3.2选择排序
基本思想:每次从待排序的数据中选出最小(或者最大的元素),存放到序列的起始位置,直到待排序的数组排序完为止。
3.2.1堆排序
详见:堆排序
3.2.2直接选择排序
排升序:在元素集合array[i]-array[n-1],选择关键码子最大(最小)的数据元素。
若它不是这组元素中的最后一个 (第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换。
在剩余的array[i]--array[n -2](array[i+1] --array[n-1])集合中重复上述步骤,直到集合剩下一个元素。
void SelectSort(int* a, int n)
{assert(a);//确保a存在//排升序int left = 0;int right = n - 1;while (left < right){int maxDex = right;int minDex = left;//遍历剩余的数组每次找出最大的和最小的将最大的换到n-1的位置,将最小的放到j位置for (int i = left; i <= right; ++i){if (a[maxDex] < a[i] ){maxDex = i;//记录最大值的下标}if (a[minDex] > a[i] ){minDex = i;//记录最小值的下标}}Swap(&a[minDex], &a[left]);if (left == maxDex)//说明最大值的下标在最左边,上一步的交换让最大值已经不是最左边,而是下标minDexmaxDex = minDex;Swap(&a[maxDex], &a[right]);left++;right--;}
}
它的时间复杂度是O(n*n)。
void SelectSort(int* a, int n)
{assert(a);//确保a存在//排升序int left = 0;int right = n - 1;while (left < right){int maxDex = right;int minDex = left;//遍历剩余的数组每次找出最大的和最小的将最大的换到n-1的位置,将最小的放到j位置for (int i = left; i <= right; ++i){if (a[maxDex] < a[i] ){maxDex = i;//记录最大值的下标}if (a[minDex] > a[i] ){minDex = i;//记录最小值的下标}}Swap(&a[minDex], &a[left]);if (left == maxDex)//说明最大值的下标在最左边,上一步的交换让最大值已经不是最左边,而是下标minDexmaxDex = minDex;Swap(&a[maxDex], &a[right]);left++;right--;}
}
3.3交换排序
3.3.1冒泡排序
详见 冒泡排序
3.3.2快速排序
详见快速排序
快速排序除了递归的实现方法外,还有非递归的实现方法,那么,如何通过非递归来实现快排的呢? 让我们一起来试试吧,我们都知道递归的方法实现快排是通过函数调用栈帧来实现的,其实非递归也是通过模拟函数调用栈帧的过程,通过数据结构的栈来模拟实现的。
虽然数据结构的栈和操作系统的栈不是一会事情,但是它们的性质是相同的(后进先出),如何通过栈来模拟实现呢?
代码:
// 快速排序 非递归实现
void QuickSortNonR(int* a, int begin, int end)
{//创建并初始化栈Stack st;StackInit(&st);//将区间[left,right]入栈StackPush(&st, end);StackPush(&st, begin);//通过栈来模拟快排递归时的调用//数据结构实现的栈和操作系统的栈的特性是一样的while (!StackEmpty(&st)){int left = StackTop(&st);StackPop(&st);int right = StackTop(&st);StackPop(&st);//如栈的时候先右后左,出栈的时候先左后右int midi = PartSort1(a, left, right);//对子区间进行快速排序的单趟排序//将左右子区间都入栈if (midi + 1 < right)//右边区间至少存在一个数{StackPush(&st, right);StackPush(&st, midi + 1);}if (left < midi - 1)//左边区间至少存在一个数{StackPush(&st, midi - 1);StackPush(&st, left);}}StackDestory(&st);
}
3.4归并排序
3.4.1归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型应用,将已经有序的子序列合并,得到完全有序的的序列;即先使每个子序列都有序,在合并子序列使得整个区间有序,若将两个有序表合并成一个有序表,称为二路归并,归并排序的核心步骤:
代码:
//单趟归并排序
void _MergeSortSignal(int *a, int begin1, int end1, int begin2, int end2, int *tmp)//闭区间
{int begin = begin1;//保存数组起始的位置方便拷贝tmp = (int*)malloc(sizeof(int) * (10 + 1));int i = begin1;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}//将剩下的一个数组尾插到tmpwhile (begin1 <= end1){tmp[i++] = a[begin1++];}while (begin2 <= end2){tmp[i++] = a[begin2++];}for (int j = begin ; j <= end2; ++j){a[j] = tmp[j];}free(tmp);}
// 归并排序递归实现
void _MergeSort(int* a, int left, int right, int * tmp)
{if (left >= right)//区间只剩下一个数{return;}int midi = (left + right) / 2;_MergeSort(a, left, midi, tmp);_MergeSort(a, midi + 1, right, tmp);//合并有序的小区间_MergeSortSignal(a, left, midi, midi + 1, right, tmp);}
void MergeSort(int* a, int n)
{//int* tmp = (int*)malloc( sizeof(int) * n);_MergeSort(a, 0, n - 1,NULL);//闭区间[left,right]//free(tmp);
}
归并排序的非递归法:
如果采用栈来模拟会将问题变得复杂,通过上面的图,我们不难发现归并排序是将要排序的区间不断缩小的过程直到要排序的区间变得有序,那么怎么样是一定有序的呢,我们不难发现,如果区间只有一个数的时候一定是有序的,所以我们采取这个思路,刚开始让相邻的连个数进行归并,此时间隔gap为一,下一次,相邻的两个数已经有序了,那么此时要将区间长度为2的相邻的两个子区间归并为一个有序的区间,此时gap = 2,依次类推增大gap就行了,什么时候结束呢,直到gap大于等于数组的长度时,数组肯定是有序的。这时候在进行归并已经没有意义了。
注意:划分子区间进行合并的时候,有可能第二个区间的长度小于第一个区间的长度,或者第二个区间不存在,因此需要注意,对第二个区间的边界进行修正或者只有第一个子区间时,这次就不需要归并排序了。
//将两个有序小区间合并为一个
void _MergeSortSignal(int *a, int begin1, int end1, int begin2, int end2, int *tmp)//闭区间
{int begin = begin1;//保存数组起始的位置方便拷贝tmp = (int*)malloc(sizeof(int) * (10 + 1));int i = begin1;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}//将剩下的一个数组尾插到tmpwhile (begin1 <= end1){tmp[i++] = a[begin1++];}while (begin2 <= end2){tmp[i++] = a[begin2++];}for (int j = begin ; j <= end2; ++j){a[j] = tmp[j];}free(tmp);}
// 归并排序非递归实现
void MergeSortNonR(int* a, int n)
{//实现思路:这里如果借助栈来模拟会将问题变得复杂起来,所以可以采取循环的方式//直接归并,第一次是相邻的两个数归并,这时候gap为1,第二次gap为而就是区间[i,i+gap-1] 和区间[i+gap,i+2*gap -1]进行插入排序,依次类推//直到gap不小于数组的长度就结束int gap = 1;while (gap < n){//单趟归并排序for (int i = 0; i < n;++i){//采用闭区间//[i,i+gap-1] 和[i+gap,i+2*gap]int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;//调用将两个数组合并成一个数组的函数if (begin2 >= n){break;//说明要排序第二组不存在,只有第一组,本次不需要再排}if (end2 >= n){//需要修正第二组的边界end2 = n - 1;}_MergeSortSignal(a, begin1, end1, begin2, end2, NULL);}gap *= 2;}
}
3.4.2归并排序应用-外排序
归并排序和其他几种排序不太一样,其它几种排序适合在内存中进行排序,而归并排序不仅可以在内存中进行排序,当数据很多时,多到内存中放不下,只能存放到文件中此时其它的排序都不怎么好用,但是归并排序却可以对数据进行排序并且是在文件中进行,所以归并排序也是外排序。
现在模拟一种场景,假设,有海量的数据,这些数据无法一次加载到内存中,现在请你编写一个程序对这些数据进行排序,并将结果保存在文件中。
思路是:
1.首先我们需要将这些数据划分成很多份,并且划分出来的每一份都可以一次性加载到内存中并且进行排序。
2.将划分好的数据一次存放到子文件中,并且使用快排将这些数据变得有序。
3.此时已经满足归并排序的先决条件,每个子序列都是有序的,此时我们只需要每次读取两个文件中的数据将它们比较并且合并到一个新的文件中,如法炮制直到最后将所有的有序子区间合并成一个文件,此时这个文件中的数据都是有序的。
代码:
//将两个文件中的有序数据合并到一个文件中并且保持有序
void _MergeFile(const char* file1, const char* file2, const char* mfile)
{FILE* fout1 = fopen(file1, "r");if (fout1 == NULL){printf("fout1打开文件失败\n");exit(-1);}FILE* fout2 = fopen(file2, "r");if (fout2 == NULL){printf("fout2打开文件失败\n");exit(-1);}FILE* fin = fopen(mfile, "w");if(fin == NULL){printf("fin打开文件失败\n");exit(-1);}int num1, num2;int ret1 = fscanf(fout1, "%d\n", &num1);int ret2 = fscanf(fout2, "%d\n", &num2);//在文件中读数据进行归并排序while (ret1 != EOF && ret2 != EOF){if (num1 < num2){fprintf(fin, "%d\n", num1);//再去fout1所指的文件中读取数据ret1 = fscanf(fout1, "%d\n", &num1);}else{fprintf(fin, "%d\n", num2);//再去fout2所指的文件中读取数据ret2 = fscanf(fout2, "%d\n", &num2);}}while (ret1 != EOF){fprintf(fin, "%d\n", num1);ret1 = fscanf(fout1, "%d\n", &num1);}while (ret2 != EOF){fprintf(fin, "%d\n", num2);ret2 = fscanf(fout2, "%d\n", &num2);}fclose(fout1);fclose(fout2);fclose(fin);
}
void MergeSortFile(const char* file)//文件归并排序
{//打开文件FILE* fout = fopen(file, "r");if (fout == NULL){printf("打开文件失败\n");exit(-1);}int n = 10;int a[10] = { 0 };char subr[1024] ;/*memset(subr, 0, 1024);memset(a, 0, sizeof(int) * n);*/int num = 0;int i = 0;int fileI = 1;while (fscanf(fout, "%d\n",&num )!=EOF){if (i < n - 1){a[i++] = num;} else{a[i] = num;QuickSort(a, 0, n - 1);//对内存中的数据进行排序sprintf(subr, "%d", fileI++);FILE* fin = fopen(subr, "w");if (fin == NULL){printf("打开文件失败\n");exit(-1);}//写数据到文件中for (int j = 0; j < n; ++j){fprintf(fin, "%d\n", a[j]);}//关闭文件i = 0;//置零对下一组数据进行操作/*memset(subr, 0, 1024);memset(a, 0, sizeof(int) * n);*/fclose(fin);}}//外排序//利用互相归并到文件中,实现整体有序char file1[100] = "1";char file2[100];char mfile[100] = "12";for (int i = 2; i <= n; ++i){sprintf(file2, "%d", i);//读取FIle和file2,进行归并排序出mfile_MergeFile(file1, file2, mfile);strcpy(file1,mfile);sprintf(mfile, "%s%d", mfile, i + 1);}fclose(fout);return NULL;
}
3.5非比较排序
非比较排序顾名思义就是不用对元素进行比较就可以进行排序了,这里介绍的是计数排序,
计数排序又叫鸽巢原理,是对哈希直接定值法的变形应用。操作步骤:
1.统计相同元素出现的次数
2.根据统计结果将序列回收到原来的序列中
代码:
// 计数排序
void CountSort(int* a, int n)
{//先遍历数组,找出最大值和最小值用来确定范围int max = a[0];int min = a[0];for (int i = 0; i < n; ++i){if (max < a[i]){max = a[i];}if (min > a[i]){min = a[i];}}//然后根据最大值和最小值的范围开辟空间int range = max - min + 1;int* CountArray = (int*)calloc(sizeof(int), range);//统计原数组中每个数出现的次数for (int i = 0; i < n; ++i){CountArray[ a[i] - min ] ++ ;//利用相对位置来计算数据出现的个数}/*Print(CountArray, 9);printf("\n");*///将临时数组中的数,覆盖到原数组中int j = 0;for (int i = 0; i < range; ++i){while (CountArray[ i ]--){a[j++ ] = i + min;//将每个数据从临时数组中拿出来加上相对数据min,然后对数组进行覆盖}}//释放临时开辟的空间free(CountArray);
}
计数排序的特性总结:
1.计数排序在数据范围集中时,效率很高,但是适用范围和场景有限。
2.时间复杂度O(max(N ,范围))
3.空间复杂度O(范围)
4.排序算法的复杂度及稳定性的分析
什么是稳定性呢,通俗的来说就是相同元素在进过排序后它们在数组中的相对位置不变,那么稳定或者不稳定有什么影响呢?在一些特殊的场景下是有影响的,比如,在一场考试中,要给前三名颁奖,如何确定前三名呢?比如前五名的成绩分别是:99 98 97 97 97,这些的情况下,是无法直接确定前三名的,因为第三,四,五名的成绩是相同的,那么这时候还有另一条规定就是这场比赛中成绩相同时,用时短 的在前面。那么这样的话,通过稳定的排序就可以确定前三名且对大家都是公平的,但是如果是不稳定的排序,这个结果是不公平的。
选择排序是不稳定的,如果在一组序列中出现多个相同的最大值,选择哪一个就是问题,或者是下图这种情况:
堆排序也是不稳定的,在建堆或者选数的时候要进行向下调整,向下调整的时候可能会改变相同元素的相对顺序,如图:
快速排序也是不稳定的,因为在选某个基准进比较时,可能相对顺序就会发生改变。
希尔排序也是不稳定的,因为在预排序时,相同的数可能被分到不同的组,所以它们的相对次序就没有办法保证了。计数排序因为是统计原来数组中每个元素出现的次数,所以相同元素的相对位置是没有办法保证的。
相关文章:
插入排序,选择排序,交换排序,归并排序和非比较排序(C语言版)
前言 所谓排序,就是将一组数据按照递增或者递减的方式进行排列,让这组数据变得有序起来。排序在生活中运用的是十分广泛的,各行各业都用到了排序,比如我们在网购的时候就是按照某种排序的方式来选择东西的。所以去了解排序的实现也…...
【每日一题】1041. 困于环中的机器人
1041. 困于环中的机器人 - 力扣(LeetCode) 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意: 北方向 是y轴的正方向。南方向 是y轴的负方向。东方向 是x轴的正方向。西方向 是x轴的负方向。 机器人可以接受下列三条指令之…...
C# 采用3DES-MAC进行签名 base64解码与编码
** 3DES-MAC ** 3DES-MAC(Triple Data Encryption Standard Message Authentication Code)是一种消息认证码(MAC)算法,用于验证消息的完整性和真实性。3DES-MAC使用了3DES(Triple Data Encryption Standa…...
AI绘画:StableDiffusion实操教程-完美世界-魔女(附高清图下载)
前段时间我分享了StableDiffusion的非常完整的教程:“AI绘画:Stable Diffusion 终极宝典:从入门到精通 ” 尽管如此,还有读者反馈说,尽管已经成功安装,但生成的图片与我展示的结果相去甚远。真实感和质感之…...
python excel 读取及写入固定格式
import xlrd import xlwt import re import pandas as pd from datetime import date,datetimefile_path "C:\\Users\\function_model.xls" def readexcel():df pd.read_excel(file_path ,"配置")# e_id# id# expression# name# freq# column_data df[e…...
SQL Server进阶教程读书笔记
最近把SQL Server进阶教程重新读了一遍,顺便整理了一下书本中的知识点 1.关键知识点 CASE WHEN ❑ 高手使用select做分支,新手用where和having做分支 ❑ 要写ELSE,要写END,避免未匹配上得到NULL ❑ check到底怎…...
DHTMLX Gantt 8.0.5 Crack -甘特图
8.0.5 2023 年 9 月 1 日。错误修复版本 修复 修复通过gantt.getGanttInstance配置启用扩展而触发的错误警告修复启用skip_off_time配置时gantt.exportToExcel()的不正确工作示例查看器的改进 8.0.4 2023 年 7 月 31 日。错误修复版本 修复 修复数据处理器不跟踪资源数据…...
RHCA之路---EX280(5)
RHCA之路—EX280(5) 1. 题目 Using the example files from the wordpress directory under http://materials.example.com/exam280/wordpress create a WordPress application in the farm project For permanent storage use the NFS shares /exports/wordpress and /export…...
”轻舟已过万重山“-----我回归更新了-----
嘿,朋友们,很久不见,甚是想念,经历过漫长的暑期生活,也许你已然收获满满。有可能你拿到了那梦寐以求的机动车行驶证,开着家长的小车在道路上自由的兜风;有可能你来了一场说走就走的旅行…...
win11右键菜单恢复win10风格
按 winx 输入以下命令 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve...
Nginx安装及配置负载均衡
文章目录 官网下载Nginx解压安装常用命令配置负载均衡七层负载均衡nginx的负载均衡语法nginx的负载均衡策略故障下线和备份服务设置proxy_pass参数 官网下载Nginx http://nginx.org/en/download.html 注:下载稳定版,即Stateable Version的,…...
C# OpenCvSharp 通道分离
效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Extensions;namespac…...
oracle 自定义存储过程(非常简单明了)
语法说明 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN %TYPE, 参数2 IN %TYPE, 参数3 OUT %TYPE) IS 变量1 %TYPE; 变量2 %TYPE; BEGIN存储过程执行语句块 END 存储过程名字;举例说明 1.举一个简单的例子 定义存储过程 easyProcedure 入参为 两个数 出参为 他们的…...
layui--记录
layui 行点击事件:点了没反应? //监听行工具事件layui.table.on(tool(demo), function (obj) {//alert(222) });原因:检查下id与lay-filter是否一致;id与lay-filter必须一致。 <table id"demo" lay-filter"dem…...
【校招VIP】测试技术考点之单元测试集成测试
考点介绍: 单元测试,集成测试的区别是:方式不同、粒度不同、内容不同。单元测试用用于验证编码单元的正确性。集成测试用于验证详细设计。体现了测试由小到大、又内至外、循序渐进的测试过程和分而治之的思想。 测试技术考点之单元测试&集成测试-相…...
【Redis专题】Redis核心数据结构实战与高性能原理解析
目录 前言课程内容一、redis数据类型1.1 字符串(string)类型:比较简单的一种使用存储模型常用命令:(截取自【菜鸟教程】)部分演示应用场景 1.2 哈希(hash)类型:同类数据归…...
常见的几种排序算法
目录 一、插入排序 1、直接插入排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、希尔排序 2.1、排序方法 2.2、图解分析 2.3、代码实现 二、选择排序 1、直接选择排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、堆排序 2.1、排序方法 2.2、图解分析 …...
动态贴纸、美颜SDK与AR:创造独特的互动体验
目前,动态贴纸、美颜SDK、增强现实(AR)等技术是比较热门的话题,它们所结合的新兴玩法更是收到大家推崇,正潜移默化的改变我们与数字世界互动的方式。 一、动态贴纸:个性化互动的开始 动态贴纸,…...
〔021〕Stable Diffusion 之 提示词反推、自动补全、中文输入 篇
✨ 目录 🎈 反推提示词 / Tagger🎈 反推提示词 Tagger 使用🎈 英文提示词自动补全 / Booru tag🎈 英文提示词自动补全 Booru tag 使用🎈 中文提示词自动补全 / tagcomplete🎈 中文提示词自动补全 tagcomple…...
如何实现响应式布局
要实现响应式布局,您可以采用以下方法: 视口设置: 在HTML的<head>部分中使用meta标签设置视口: <meta name"viewport" content"widthdevice-width, initial-scale1.0">使用百分比: 使…...
HTML <tr> 标签
实例 一个简单的 HTML 表格,包含两行两列: <table border="1"><tr><th>Month</th><th>Savings</th></tr><tr><td>January</td><td>$100</td></tr> </table>定义和用法 &l…...
点云从入门到精通技术详解100篇-点云多尺度分类网络
目录 前言 研究现状与发展趋势 国内外研究现状 点云处理应用研究现状...
电脑怎么设置定时关机,2个简单的操作
电脑作为现代生活中不可或缺的工具,我们通常会在工作或娱乐过程中使用它。但有时候,我们可能需要在一段时间后自动关机,例如在下载完成后或在睡觉前。那么电脑怎么设置定时关机呢?为了满足这种需求,电脑提供了多种定时…...
Uboot指令与烧录
目录 1 NAND Flash: 1)地址空间说明 2)烧写u-boot 3)烧写内核 4)烧写文件系统 5)设置启动参数 2 SPI Flash: 1)地址空间说明 2)烧写u-boot 3)烧写内…...
Visual Studio中使用预编译头文件
预编译头文件(Precompiled Header,PCH)是一种C/C编译优化技术,用于提高大型项目的编译速度。PCH 文件包含了常用的头文件的预编译结果,它可以在编译其他源文件之前被加载到内存中,从而减少了重复的头文件解…...
C语言:选择+编程(每日一练Day15)
目录 选择题: 题一: 题二: 题三: 题四: 题五: 编程题: 题一:寻找奇数 思路一: 题二:寻找峰值 思路一: 本人实力有限可能对一些地方解…...
确定Mac\Linux系统的架构类型是 x86-64(amd64),还是 arm64 架构
我们在下载软件或镜像时会有很多版本,那需要根据我们的系统架构选择正确的软件或镜像版本。 要确定你的系统使用的是 x86-64(amd64) 还是 arm64 架构,可以使用以下方法之一: 使用 uname 命令: 打开终端&am…...
Python脚本
update_format.py 批量转视频格式,超级慢,没什么卵用 import os import asyncio import subprocess import concurrent.futures import tracemalloctracemalloc.start()# 创建日志文件 log_file open(conversion_log.txt, w)async def convert_mkv_t…...
Kotlin的遍历方法
for循环 在下面代码中1…10表示的是1到10,两边都是闭包,输出12345678910 for (i in 1..10) println(i)加上花括号也支持 for (i: Int in 1..10) {println(i)}另外,当对整数进行for循环时,Kotlin还提供了一个step函数来定义迭代的…...
AskIt: Unified Programming Interface for Programming with Large Language Models
本文是LLM系列文章,针对《AskIt: Unified Programming Interface for Programming with Large Language Models》的翻译。 AskIt:用于大型语言模型编程的统一编程接口 摘要1 引言2 动机例子3 设计与实现4 实验评估5 相关工作6 结论 摘要 在不断发展的软…...
wordpress 菜单 调用/seo关键词推广优化
工具类,详见附件,下载地址: http://files.cnblogs.com/files/007sx/weixin_util.zip 传的参数参考微信开发者文档-发送模板消息: http://mp.weixin.qq.com/wiki/17/304c1885ea66dbedf7dc170d84999a9d.html#.E5.8F.91.E9.80.81.E6.A8.A1.E6.9D…...
网站优化电话/竞价被恶意点击怎么办
https://blog.csdn.net/lu2631605872/article/details/78226486...
dedecms双语网站/友情链接论坛
物联网事业部总裁DipeshPatel于台北国际计算机展的CPX论坛,发表“迈入物联网时代的机会与挑战”(Meetingthe Challengesof Scalingthe IoT)演说,畅谈物联网的最新技术与发展趋势,和ARM在物联网的发展近况。 ARM物联网事…...
做网站客户尾款老不给怎么办/创建自己的网页
LeetCode-面试题13. 机器人的运动范围-中等 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行…...
南山网站优化/谷歌三件套下载
1、首先下载arm-linux-gcc-4.4.3.tgz到任意的目录下,然后解压。 2、将arm-linux-gcc 安装到/opt/Friendlyarm/4.4.3 目录。 3、在/usr/local/下建立 arm的文件夹,并修改属性 mkdir arm chmod 777 arm 4、把 opt下的4.4.3 目录复制到 /usr/local/arm下 su…...
做网站用哪里的服务器比较好/百度精准营销获客平台
1、调整状态 最近发生了很多事,很多不好的事,以至于时常状态不在线,没有去调整,会告诉自己都是假的,然后继续低落难过,这些负面影响抛不掉,今天尝试调整 (1)尽量不要去看…...