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

数据结构排序入门(3):核心排序(归并排序,归并非递归排序,计数排序及排序扫尾复杂度分析)+八大排序源码汇总

1.归并排序

思想:对半分成左右区间,左右区间有序,借助第三个数组tmp。

//归并排序
void _MergeSort(int* a, int*tmp, int begin, int end)
{assert(a);//区间中没有元素时不再合并if (begin >= end){return;}//定义一个mid,对半分成两个区间int mid = (begin + end) / 2;_MergeSort(a, tmp, begin, mid);_MergeSort(a, tmp, mid + 1, end);//左右区间明确int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;int i = begin;while (begin1 <= end1 && begin2 <= end2)//两个条件必须同时结束{if (a[begin1] < a[begin2])//如果begin1位置的数据比begin2小,就插入到tmp数组当中{tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];//begin2小于begin1}}//不确定是哪一个先走完,将剩余元素合并到tmp中while (begin1<= end1){tmp[i++] = a[begin1++];}while (begin2 <= end2){tmp[i++] = a[begin2++];}memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}
void MergeSort(int* a, int n)
{assert(a);//向内存申请一个数组:tmp,这个数组放置拷贝的数据int* tmp = (int*)malloc(sizeof(int) * n);//拷贝的数据个数跟原数组个数是一样的if (tmp == NULL){perror("malloc fail");exit(-1);}_MergeSort(a, n, 0, n - 1);free(tmp);tmp == NULL;
}

1.1. 归并排序非递归

递归使用会造成时间复杂度的上升,所以优化归并排序,这里可用非递归模式进行。
思想:定义一个gap,gap成2的倍数增加,一个一个归并排成有序数组,gap=1;两个两个归并,gap=2。

//归并排序非递归
void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if(tmp==NULL){perror("malloc fail");return;}int gap = 1;while (gap < n)  //gap代表每组归并的个数,当gap>=n的时候,说明循环结束{for (int i = 0; i < n; i += 2 * gap)//第一次gap等于1,第二次gap=2;第三次gap=4依次{int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;// 第二组都越界不存在,这一组就不需要归并if (begin2 >= n)break;// 第二的组begin2没越界,end2越界了,需要修正一下,继续归并if (end2 >= n)end2 = n - 1;int j = i;while (begin1 <= end2 && begin2 <= end2){if (a[begin1] <= a[end1]){tmp[j++] = a[begin1++];}else{tmp[j++] = a[begin2++];}}//不清楚是begin1先结束还是begin2先结束while (begin1 <= end1){tmp[j++] = a[begin1++];}while (begin2 < end2){tmp[j++] = a[begin2++];}memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));}gap *= 2;//gap呈2的倍数}free(tmp);tmp = NULL;
}

2. 计数排序

思想:将一组数中最大的和最小的数找出来,相减得到数据个数,用这个数据个数申请新的临时数组count(这个临时数组有自然数个下标),将原数组中每个数字出现的个数统计到临时数组count中,然后排序。

//计数排序
void CountSort(int* a, int n)
{//对比出最大的最小的数,相减得到范围int min = a[0], max = a[0];//选择排序for (int i = 1; i < n; i++){if (min > a[i]){min =a[i];}if (max < a[i]){max =a[i];}}int range = max - min + 1;//需要定义一个数组countint* count = (int*)calloc(range, sizeof(int));if (count == NULL){perror("calloc fail");exit(-1);}//统计次数for (int i = 0; i < n; i++){count[a[i]-min]++;//遍历原数组中的每个数据count[a[i]]++//a[i]  原数组,对应a的位置++}//排序int j = 0;//用于返回数组for (int i = 0; i < range; i++){while (count[i]--)//当i的位置是0,后置--,就指向-1{a[j++] = i + min;}}free(count);
}

3. 插入排序,冒泡排序,选择排序,希尔排序,堆排序,快排,归并排序的时间空间复杂度分析汇总

排序空间时间复杂度分析汇总
排序时间复杂度空间复杂度
插入排序O(N ^2)O(1)
冒泡排序O(N^2)O(1)
选择排序O(N^2)O(1)
希尔排序O(N^1.3)O(1)
堆排序O(N*log N)O(1)
快排O(N*log N)O(log N)
归并排序O(N*log N)O(N)

八大排序源码:

https://gitee.com/kq3483687668/test_c/tree/master/SortSummarize


文章转载自:

http://1UVOlKpD.rysmn.cn
http://AdTpRAbz.rysmn.cn
http://YzlgXQ36.rysmn.cn
http://mqjeNTa1.rysmn.cn
http://PcjcTkPt.rysmn.cn
http://8dBkEoTF.rysmn.cn
http://x3XSodwB.rysmn.cn
http://ZtuHAMVk.rysmn.cn
http://BN4xax9f.rysmn.cn
http://kicKaOrk.rysmn.cn
http://AfyLyWol.rysmn.cn
http://xX8Z5p8x.rysmn.cn
http://6GMPpf1N.rysmn.cn
http://6fXCPoIV.rysmn.cn
http://J8E65k9R.rysmn.cn
http://wzrIcDNR.rysmn.cn
http://2gCzlkeV.rysmn.cn
http://BzsRTzcG.rysmn.cn
http://ooLsuKOL.rysmn.cn
http://t8nBpzhD.rysmn.cn
http://pY0e1Y90.rysmn.cn
http://oEU3rYdy.rysmn.cn
http://2bqH2oCU.rysmn.cn
http://VBJgGjeQ.rysmn.cn
http://6CGvZcK9.rysmn.cn
http://QqdEQDxS.rysmn.cn
http://CQL0dGi3.rysmn.cn
http://F1cDrp33.rysmn.cn
http://YH2rJFDK.rysmn.cn
http://HkuY0hGW.rysmn.cn
http://www.dtcms.com/a/387945.html

相关文章:

  • 计算机网络七层模型理解
  • 同步与互斥学习笔记
  • 命令行方式部署OceanBase 集群部署
  • 小迪安全v2023学习笔记(八十四讲)——协议安全桌面应用hydra爆破未授权检测
  • MAC-简化版枚举工具类
  • Science Robotics 美国康奈尔大学开发的新型触觉显示器
  • Java 零基础学习指南
  • 音频剪辑总出错?音视频分割工具免费功能实测 音视频分割工具新手怎么用?4步搞定音视频分割 音视频分割工具常见问题解决:新手避坑参考
  • 线性回归与 Softmax 回归总结
  • 文字一键生成视频软件哪家比较靠谱?
  • Android,Jetpack Compose,坦克大战游戏案例Demo(随机生成地图)
  • Unity 笔记:构建AAB包大小超过谷歌商店上限
  • 在idea中git修改用户名和邮箱/切换账号
  • 设计模式(C++)详解——组合模式(Composite Pattern)(1)
  • 103、23种设计模式之外观模式(12/23)
  • 依赖注入基础
  • 代码随想录二刷之“图论”~GO
  • 基础数学转金融数学考研:一场需要清醒规划的转型
  • Alpha World携手非小号Talking Web3,海上ALPHA WEB3派对启航
  • Vue3钩子,路由拦截实现
  • 数据结构七大排序算法模拟实现性能分析
  • vue+react笔记
  • springboot获取wav文件音频长度
  • 【Redis】-- 缓存
  • 鸿蒙高效数据处理框架全攻略:缓存、并行与流式实战
  • 全网首发! Nvidia Jetson Thor 128GB DK 刷机与测评(五)常用功能测评 - RealtimeSTT 音频转文本 同声传译
  • OpenHarmony 之生态规则管控服务(Ecological Rule Manager Service)源码深度解读
  • 无人机图传是什么意思 应用和趋势是什么?
  • arm coresight
  • Vue3 + vue-draggable-plus 实现可拖拽的数据源选择面板