当前位置: 首页 > news >正文

安庆网站建设专业制国内最新的新闻

安庆网站建设专业制,国内最新的新闻,上海公司招聘,黑河网站制作排序 概念 排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的⼤⼩,递增或递减的排列起来的 操作。 比较排序 插入排序 直接插入排序 直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是:把待…

排序

概念

排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的⼤⼩,递增或递减的排列起来的 操作。

比较排序

image-20250219165832319

插入排序

直接插入排序

直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是:把待排序的记录按其关键码值的⼤⼩逐个插⼊到⼀个已经排好序的有序序列中,直到所有的记录插⼊完为⽌,得到⼀个新的有序序列 。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

希尔排序

希尔排序法⼜称缩⼩增量法。希尔排序法的基本思想是:先选定⼀个整数(通常是gap = n/3+1),把待排序⽂件所有记录分成各组,所有的距离相等的记录分在同⼀组内,并对每⼀组内的记录进⾏排序,然后gap=gap/3+1得到下⼀个整数,再将数组分成各组,进⾏插⼊排序,当gap=1时,就相当于直接插⼊排序。

它是在直接插⼊排序算法的基础上进⾏改进⽽来的,综合来说它的效率肯定是要⾼于直接插⼊排序算法的。

1,gap > 1,预排序

2,gap = 1,直接插入排序(时间复杂度接近O(n))

希尔排序的时间复杂度估算:

外层循环:

外层循环的时间复杂度可以直接给出为: O(log2 n) 或者 O(log3 n) ,即 O(log n)

内层循环:

选择排序

选择排序的基本思想:

每⼀次从待排序的数据元素中选出最⼩(或最⼤)的⼀个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

直接选择排序

直接选择排序的特性总结:

1,直接选择排序思考⾮常好理解,但是效率不是很好。实际中很少使⽤

2, 时间复杂度: O(N2 )

3,空间复杂度: O(1)

堆排序

交换排序

冒泡排序

快速排序

快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两⼦序列,左⼦序列中所有元素均⼩于基准值,右⼦序列中所有元素均⼤于基准值,然后最左右⼦序列重复该过程,直到所有元素都排列在相应位置上为⽌。

//快速排序
void QuickSort(int* arr, int left, int right)
{if (left >= right)return;//确定基准值int keyi = _QuickSort(arr, left, right);QuickSort(arr, left, keyi-1);QuickSort(arr, keyi+1,right);
}

如何将基准值放到相应的位置?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最差情况是n^2

快速排序特性总结:

1,时间复杂度: O(nlogn)

2,空间复杂度: O(logn)

1, hoare版本

算法思路 :

1,创建左右指针,确定基准值

2,从右向左找出⽐基准值⼩的数据,从左向右找出⽐基准值⼤的数据,左右指针数据交换,进⼊下次循环

//确定基准值
int _QuickSort(int* arr, int left, int right)
{int keyi = left;++left;while (left <= right){//右边找小while (left <= right && arr[right] > arr[keyi]){--right;}//左边找大while (left <= right && arr[left] < arr[keyi]){++left;}if (left <= right){swap(&arr[left++], &arr[right--]);}}swap(&arr[keyi], &arr[right]);return right;
}
2,挖坑法

创建左右指针。⾸先从右向左找出⽐基准⼩的数据,找到后⽴即放⼊左边坑中,当前位置变为新

的"坑",然后从左向右找出⽐基准⼤的数据,找到后⽴即放⼊右边坑中,当前位置变为新的"坑",结束循环后将最开始存储的分界值放⼊当前的"坑"中,返回当前"坑"下标(即分界值下标)

//挖坑法
int _QuickSort2(int* arr, int left, int right)
{int key = arr[left];int hole = left;while (left < right){//右边找小while (left < right && arr[right] >= key){--right;}arr[hole] = arr[right];hole = right;//左边找大while (left < right && arr[left] <= key){++left;}arr[hole] = arr[left];hole = left;}arr[hole] = key;return hole;
}
3,双指针法(lomuto前后指针 )

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

//双指针法(lomuto前后指针 )
int _QuickSort3(int* arr, int left, int right)
{int key = left;int  prev = left;int cur = left + 1;while (cur <= right){if (arr[cur] < arr[key] && ++prev != cur){swap(&arr[prev], &arr[cur]);}cur++;}swap(&arr[key], &arr[prev]);return prev;
}
非递归版本的快速排序

归并排序

排序算法思想:

归并排序(MERGE-SORT)是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法(Divide

and Conquer)的⼀个⾮常典型的应⽤。将已有序的⼦序列合并,得到完全有序的序列;即先使每个

⼦序列有序,再使⼦序列段间有序。若将两个有序表合并成⼀个有序表,称为⼆路归并。

void _MergeSort(int* arr, int left, int right, int* tmp)
{if (left >= right){return;}int mid = (left + right) / 2;_MergeSort(arr, left, mid, tmp);_MergeSort(arr, mid + 1, right, tmp);int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;int index = begin1;while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] < arr[begin2]){tmp[index++] = arr[begin1++];}else{tmp[index++] = arr[begin2++];}}while (begin1 <= end1){tmp[index++] = arr[begin1++];}while (begin2 <= end2){tmp[index++] = arr[begin2++];}//拷贝,可以使用memcopy,也可以使用循环for (int i = left; i <= right; i++){arr[i] = tmp[i];}
}//归并排序
void MergeSort(int* arr, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");exit(1);}_MergeSort(arr, 0, n - 1, tmp);free(tmp);tmp = NULL;
}

非比较排序

计数排序

计数排序⼜称为鸽巢原理,是对哈希直接定址法的变形应⽤。 操作步骤:

1,统计相同元素出现次数

2,根据统计的结果将序列回收到原来的序列中

//非比较排序
//计数排序
void CountSort(int* arr, int n)
{int min = arr[0], max = arr[0];for (int i = 1; i < n; i++){if (arr[i] < min){min = arr[i];}if (arr[i] > max){max = arr[i];}}int range = max - min + 1;int* count = (int*)malloc(sizeof(int)*range);if (count == NULL){perror("malloc fail");exit(1);}memset(count, 0, sizeof(int) * range);for (int i = 0; i < n; i++){count[arr[i] - min]++;}int j = 0;for (int i = 0; i < range; i++){while (count[i]--){arr[j++] = i + min;}}
}

稳定性

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的

相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,⽽在排序后的序列中,r[i]仍在r[j]之

前,则称这种排序算法是稳定的;否则称为不稳定的。

http://www.dtcms.com/a/591058.html

相关文章:

  • 网页设计与制作教程江西高校出版社广州seo网络营销培训
  • 【读论文】大杂烩
  • 中建卓越建设有限公司网站首页企业官网开发排行榜
  • 做网站零成本旅游网站建设的技术可行性
  • 外贸网站推广机构网络营销方式类型有哪些
  • 网站建设古典风格国家开发投资集团有限公司
  • 天机学堂(上)
  • 企业网站 响应式网站如何做整合营销
  • 公司做一个静态网站多少钱辽宁移动惠生活app官方版
  • wordpress 无法粘贴上海优化网站价格
  • 牛客面经八股题目----包含题解版
  • 网站如何防止攻击网页制作公司是做什么的
  • 网站建设下一步计划wordpress 属于多个栏目
  • 公司内部的网站主要作用井冈山保育院网站建设
  • 娄底建设网站制作广州工业设计公司有哪些
  • 网站备案流程审核单高校后勤网站建设要求及内容
  • C++面试题:Linux常用指令详解
  • 南山高端网站建设广州网站设计公司推荐哪家
  • 浙江省建设厅网站如何查安全员厦门网络推广公司
  • 网站建设案例教程做网站图片尺寸
  • pc三合一网站胶州收电脑号码是多少
  • 自学做网站学习建设网站难么
  • 16.Dify接入外部知识库
  • 百度给做网站收费多少钱韩国网站如何切换中文
  • 可以用AI做网站上的图吗昌平网站开发公司
  • 大学生可以做的网站网站如何被百度快速收录
  • php网站开发就业最便宜的购物软件排名
  • 苏州网站建设方案策划上海专业建设网站制作
  • dephi 网站开发杭州抖音代运营
  • 最小作用量原理MATLAB仿真