东莞企业网站建设公司装修公司名字大全参考免费
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:21
当前位置: 首页 > news >正文
东莞企业网站建设公司,装修公司名字大全参考免费,哈尔滨门户网站建设,wordpress 优酷去广告排序算法前言插入排序折半插入排序希尔排序冒泡排序快速排序选择排序堆排序归并排序前言 排序算法#xff1a;将一堆数据元素按关键字递增或者递减的顺序#xff0c;进行排序。 排序算法的评价指标#xff1a;时间复杂度#xff0c;空间复杂度#xff0c;算法稳定性。 算… 排序算法前言插入排序折半插入排序希尔排序冒泡排序快速排序选择排序堆排序归并排序前言 排序算法将一堆数据元素按关键字递增或者递减的顺序进行排序。 排序算法的评价指标时间复杂度空间复杂度算法稳定性。 算法稳定性 关键字相同的元素在排序之后相对位置不变。 内部排序数据都在内存中数据量不大能放在内存中关注时、空复杂度 外部排序数据量太大无法放入全部内存数据放在在磁盘中关注磁盘读写次数 插入排序 算法思想每次将一个待排序的元素按其关键字大小插入到前面已经排好的子序列中知道其全部记录插入完成。 void Insert_sort1(int* a,int n) {for (int i 1; i n; i){if (a[i] a[i - 1]){//后小于前int j i - 1;//标记前int temp a[i];//保存后while (j 0 a[j]temp)/后移腾位不能写成a[j]a[i]因为第一次移位(ij1)后a[i]就被覆盖了,并不是原先的值这也是为什么要保存a[i]的值的原因/{a[j1] a[j];–j;}//当a[j]temp时循环跳出此时腾出了j1这个位置a[j1] temp;}} }对于排序算法要明确知道所定义的每一个变量的含义以及在循环过程中的变化情况死记硬背是万不可行要掌握核心思想仔细体会在细节的处理。 折半插入排序 在前面已有序序列中查找待插入元素位置因为前面已经是有序序列所以可用折半查找折半查找效率O(logn)。 void Binary_insert_sort(int* a, int n) {int i, j, low, high, mid;for (i 1; i n; i){int temp a[i];low 0; high i - 1;while (lowhigh){mid (low high) / 2;if (a[mid]temp)high mid - 1;else low mid 1;}for (int j i - 1; j high 1; –j)a[j 1] a[j];a[high 1] temp;} }分析优化情况实际上这样优化只是减少了之前在while循环中的比较次数总体时间复杂度还是O(n^2)因为依然要移动大量元素。想到这里能不能在链表中用折半插入排序呢答案是不可以 原因在于折半查找利用了数组能够通过小标随机访问的特性而链表无法做到随机访问只能从前往后遍历所以无法应用折半查找但可以利用插入排序。 希尔排序 对待排序表按一定增量进行分割成子表对每个子表进行直接插入排序增量dd/2。 不断缩小增量最后d1时为直接插入排序因为前面的每次排序致使元素已经基本有序而直接插入排序当元素基本有序时时间复杂度较低这也就是希尔排序时间复杂度降低的原因。 /* 算法思想缩小增量的直接插入排序利用直接插入排序在元素基本有序时时间复杂度接近O(n)来降低时间复杂度 每次对小规模的子表进行排序最后一次的子表已经是表本身 理解希尔排序代码首先要充分理解直接插入排序的思想 / int shell_sort(int a, int n) {int num 0;for (int d n / 2; d 1; d / 2)//增量设置每次÷2终值为1直接插入排序{for (int i d; i n; i)//对i不可以进每次加d操作对i的遍历已经从0开始变为d开始{int j i - d;//原先是减一现在为减dint temp a[i];if (a[i]a[i - d]){num;for (j i - d; j 0 a[j] temp; j - d)//循环每次减da[j d] a[j];a[j d] temp;//参照插入排序1变d}}}return 1; }不稳定排序只能用于线性表不能用于链表。 冒泡排序 从后往前或从前往后两两比较相邻元素的值若为逆序则交换直到序列比较完。 每一趟排序是最小的元素冒到最前。每一趟确定一个元素的位置。 稳定排序适用于链表 #includestdbool.h void swap(int* a, int j) {int temp a[j];a[j] a[j - 1];a[j - 1] temp; }int Bubble_sort(int* a, int n) {for (int i 0; i n-1; i){bool flag false;for (int j n -1; j i; j–)//jii前的元素已经有序从后往前冒泡前面元素有序{if (a[j - 1] a[j])//左大于右才交换稳定{swap(a,j);flag true;//标记一趟循环是否进行过交换}}if (flag false)//没有进行交换说明表中元素已有序提前退出return 1;}return 1; }注意两个for循环的n-1对i的n-1是最后一个元素不判断 对j的n-1是从最后一个元素开始判断是否逆序逆序则交换直到ji 快速排序 分治思想每次选一位置元素作为枢轴进行数组划分划分结果要让枢轴之前都枢轴之后都这样也就确定了一个枢轴元素的位置并接着以此枢轴划分为两个子数组对子数组再进行划分最终将所有元素排好序。 int Partition(int, int, int); void Quick_sort(int a,int low,int high) {if (low high)//递归跳出{int pivotpos Partition(a, low, high);//划分Quick_sort(a, low, pivotpos - 1);//枢轴以左Quick_sort(a, pivotpos 1, high);//枢轴以右} } int Partition(int* a, int low, int high)//时间复杂度O(n)对表用lowhigh指针扫描一遍 {int pivot a[low];while (low high)//lowhigh指针相遇时跳出共同所指位置即枢轴元素应放位置此时前都比其小后都比其大{while (low higha[high] pivot) –high;//当出现小于枢轴时跳出while此时high所指就是小于枢轴a[low] a[high];//low最初的值已经保存在pivot中可视为low此时空出直接放入每次while只能交换一个值while (low higha[low] pivot) low;//low指针右移找到比枢轴大的跳出whilelow此时所指为大于枢轴的元素下步移动a[high] a[low];//在上面high的值已经被存入所以视high为空放入low值}//跳出最外层while此时lowhigh所指相同且其原值已经被保存到别处可视为空则放入pivota[high] pivot;//a[high]pivot;是一样的return high;//return high;是一样的 } /* 快排时间复杂度O(n*递归层数) 如果每次选择的枢轴元素都刚好是顺序的中间元素的值则递归层数为logn 最好时间复杂度O(nlogn) 最坏O(n^2) /跑一亿随机数排序时会崩。 int Partition(int, int, int); void Quick_sort(int* a,int low,int high) {if (low high){int pivotpos Partition(a, low, high);Quick_sort(a, low, pivotpos - 1);Quick_sort(a, pivotpos 1, high);} } int Partition(int* a, int low, int high) {int pivot a[low];while (low high){while (low higha[high] pivot) –high;a[low] a[high];while (low higha[low] pivot) low;a[high] a[low];}a[high] pivot;return high; }选择排序 每次选取未排序列的最小值与当前未排序的第一个位置交换知道最后一个元素。 void Choice_sort(int* a, int n) {for (int i 0; i n-1; i){int mini;for (int j i1; j n; j)//在二层for循环外无判断所以内层for始终都要被执行{if (a[j] a[min])min j;//min保存最小值下标用小标处理相对于用值处理要简单}//找到最小a[j]与a[i]交换if (min!i)//若当前a[i]就是未排序中最小则不用交换{int temp a[i];a[i] a[min];a[min] temp;}} } /* 不稳定也使用于链表 无论待排序列是否有序时间复杂度都是 n(n-1)/2 - O(n^2) /堆排序 / 大根堆小根堆完全二叉树逻辑视角因为是完全二叉树可以用数组存存储视角 根左右孩子 根左右孩子 i的左孩子 2i i的右孩子 2i1 i的父节点 i/2向下取整 构建和维护大根堆 检查非终端节点 i(n/2)是否满足大根堆的要求 / void HeadAdjust(int, int, int); void BuildMaxHeap(int* a, int len) {for (int i len / 2; i 0; i–)//从后往前遍历非终端结点HeadAdjust(a, i, len); } //将以k为根的子树调整为大根堆局部微调 void HeadAdjust(int* a, int k, int len) {int root a[k];//暂存子树的根节点注意是子树for (int i 2 * k; i len; i * 2)//i2k所以此时i表达k的左孩子{if (i lena[i] a[i 1])//取左右孩子的较大值i;if (root a[i])break;//根大于较大值,说明该子树满足大根堆退出else //否则交换二者{a[k] a[i];k i;//进行交换则改变了其他子树的大根堆所以要更新k值继续向下检查}}a[k] root; } void Heap_Sort(int a, int len) {BuildMaxHeap(a, len);for (int i len; i 0; i–){int temp a[i];a[i] a[0];a[0] temp;//大根堆所以和堆顶元素交换HeadAdjust(a, 0, i - 1);//交换后堆顶元素到了叶子结点不必再考虑它修正大根堆} }构建大根堆每次选择堆顶元素已选元素与叶子交换就不再看维护其他结点构成大根堆大根堆逐渐缩小最后只剩一个根结点时其实已经变成小根堆。 不稳定排序 时间复杂度O(nlogn) 归并排序 把两个或多个已经有序的序列合并成一个 所以分为“2路”归并和多路归并 m路归并每次选出一个关键字需对比m-1次。 内部排序中一般采用2路归并 //递归实现 #includestdio.h #includestdlib.h #includetime.h #includestdbool.h int* b; void meger(int* a, int l, int mid, int r) {// int* b(int*)malloc(sizeof(int)n);//辅助数组b不能在这里申请应定义为全局首先定义全局指针然后再main函数中申请空间 int k l;int i, j;for (i l, j mid 1; i midj r;k)//不能在for中进行ij的增{if (a[i]a[j])b[k] a[j];else b[k] a[i];}//循环结束条件就是ij之一越界其子数组只是其中一个下标越界while (imid)b[k] a[i];while (jr)b[k] a[j];for (int i l; i r; i)//处理好的b赋给aa[i] b[i]; } void megersort(int a, int l, int r) {if (l r) return;int mid (l r) / 2;megersort(a, l, mid);megersort(a, mid 1, r);meger(a, l, mid, r); } void pint(int* a, int n) {for (int i 0; in; i)printf(%d , a[i]); } int main() {clock_t s, f;srand(time(0));int n;scanf(%d, n);b (int*)malloc(4 * n);int* a (int*)malloc(4 * n);for (int i 0; in; i)a[i] rand() % 100 1;//pint(a, n);s clock();megersort(a, 0, n - 1);f clock();printf(time%f\n, (float)(f - s)/1000);printf(\n);//pint(a, n);return 0; }递归结束当划分的数组只有一个元素时开始合并并且只有一个元素的子数组必然是有序的 归并的过程就像形成一颗二叉树二叉树有logn层归并排序要logn趟每趟都要O(n)时间就像当于遍历一遍时间复杂度为O(nlogn) 空间复杂度O(n)主要是要用到一个和原数组大小相同辅助数组还有递归栈但是栈只要logn低阶舍去。 稳定排序。
- 上一篇: 东莞企石网站设计高端网站建设公司好吗
- 下一篇: 东莞企业网站哪家强各种网站底部图标代码
相关文章
-
东莞企石网站设计高端网站建设公司好吗
东莞企石网站设计高端网站建设公司好吗
- 技术栈
- 2026年03月21日
-
东莞企石网站建设北京优质网站制作
东莞企石网站建设北京优质网站制作
- 技术栈
- 2026年03月21日
-
东莞培训网站建设在门户网站管理建设工作讲话
东莞培训网站建设在门户网站管理建设工作讲话
- 技术栈
- 2026年03月21日
-
东莞企业网站哪家强各种网站底部图标代码
东莞企业网站哪家强各种网站底部图标代码
- 技术栈
- 2026年03月21日
-
东莞企业网站推广seo com
东莞企业网站推广seo com
- 技术栈
- 2026年03月21日
-
东莞企业网站找谁网站建设湖南
东莞企业网站找谁网站建设湖南
- 技术栈
- 2026年03月21日






