排序八卦炉之归并、计数

news/2024/11/30 0:44:34/

在这里插入图片描述

文章目录

  • 1.归并排序
    • 1.1初识代码
    • 1.2代码分析
    • 1.3复杂度
    • 1.4非递归版本1.0
      • 1.初识代码
      • 2.代码分析
    • 1.5非递归版本2.0
      • 1.初识代码
      • 2.代码分析
  • 2.计数排序
    • 2.1初始代码
    • 2.2代码分析

1.归并排序

1.1初识代码

//归并排序 时间复杂度:O(N*logN)   空间复杂度:O(N)
void PartMergeSort(int* a, int begin, int end, int* tmp)
{if (begin >= end)return;int mid = (begin + end) / 2;//[begin, mid] [mid+1, end] PartMergeSort(a, begin, mid, tmp);PartMergeSort(a, mid + 1, end, tmp);//[begin, mid] [mid+1, end]//  [i, mid]     [j, end]int i = begin, j = mid + 1, k = i;while (i <= mid && j <= end){if (a[i] < a[j])tmp[k++] = a[i++];elsetmp[k++] = a[j++];}while (i <= mid)tmp[k++] = a[i++];while (j <= end)tmp[k++] = a[j++]; memcpy(a + begin, tmp + begin, (end - begin + 1) * sizeof(int));
}
void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){printf("malloc fail\n");exit(-1);}//void PartMergeSort(int* a, int begin, int end, int* tmp);PartMergeSort(a, 0, n - 1, tmp);free(tmp);
}

1.2代码分析

1.3复杂度

时间复杂度:O(N*logN) 空间复杂度:O(N)
此类情况已讲过多次,此处不再赘述。

1.4非递归版本1.0

所谓的递归改非递归我们在讲快排时就涉及到过,无非就是通过递归的特性,可以在不断地调用同一函数期间传不同参数,从而达到“分而治之”的效果。上文中快排改非递归用到的栈模拟实现递归,也就是运用了栈“先入后出”的特性【用队列也行 只不过更加麻烦】 而在归并排序想要用非递归实现 是一件更为复杂的事情,需要考虑的更全面。

1.初识代码

void MergeSort_NonRecursion1(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){printf("malloc fail\n");exit(-1);}int range = 1;while (range < n){printf("range = %d ->", range);for (int index = 0; index < n; index += 2 * range){int i = index, k = i,  end = index + range - 1;int j = index + range, End = index + 2 * range - 1;//修正边界if (end >= n){end = n - 1;j = n;End = n - 1;}else if (j >= n){j = n;End = n - 1;}else if (End >= n)End = n - 1;printf("[%d,%d]--[%d, %d]  ", i, end, j, End);//数据排序while (i <= end && j <= End){if (a[i] < a[j])tmp[k++] = a[i++];elsetmp[k++] = a[j++];}while (i <= end)tmp[k++] = a[i++];while (j <= End)tmp[k++] = a[j++];}printf("\n");memcpy(a, tmp, sizeof(int) * n);range *= 2;}free(tmp);
}

2.代码分析

在这里插入图片描述
在这里插入图片描述

1.5非递归版本2.0

1.初识代码

void MergeSort_NonRecursion2(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){printf("malloc fail\n");exit(-1);}int range = 1;while (range < n){printf("range=%d->", range);for (int index = 0; index < n; index += 2 * range){int i = index, k = i, end = index + range - 1;int j = index + range, End = index + 2 * range - 1;if (end >= n || j >= n)break;else if (End >= n)End = n - 1;printf("[%d,%d]--[%d,%d]  ", i, end, j, End);int m = End - i + 1;while (i <= end && j <= End){if (a[i] < a[j])tmp[k++] = a[i++];elsetmp[k++] = a[j++];}while (i <= end)tmp[k++] = a[i++];while (j <= End)tmp[k++] = a[j++];memcpy(a + index, tmp + index, sizeof(int) * m);}printf("\n");range *= 2;}free(tmp);
}

2.代码分析

在这里插入图片描述

2.计数排序

2.1初始代码

//计数排序  时间复杂度:O(max(num, N)) 空间复杂度:O(num)
void CountSort(int* a, int n)
{//确定最值int min = a[0], max = a[0];for (int i = 1; i < n; ++i){if (a[i] < min)min = a[i];if (a[i] > max)max = a[i];}int num = max - min + 1;  //最多有N个"连续"的数据//开空间int* arr = (int*)malloc(sizeof(int) * num);if (arr == NULL){printf("malloc fail\n");exit(-1);}memset(arr, 0, sizeof(int) * num);//a的数据映射到arr的下标 arr的值存储对应数据出现次数for (int i = 0; i < n; ++i)arr[a[i] - min]++;for (int i = 0, j = 0; i < num; ++i){while (arr[i]--)a[j++] = i + min;}
}

2.2代码分析

在这里插入图片描述


http://www.ppmy.cn/news/1011128.html

相关文章

Element-UI简介

目录 安装 常用组件 Container 布局容器 Button 按钮 MessageBox 弹框 Form 表单验证 element-ui是一个前端的ui框架&#xff0c;封装了很多已经写好的ui组件&#xff0c;例如表单组件&#xff0c;布局组件&#xff0c;表格组件.......是一套桌面端组件。 Element - 网站…

每天一道leetcode:剑指 Offer 59 - II. 队列的最大值(中等)

今日份题目&#xff1a; 请定义一个队列并实现函数 max_value 得到队列里的最大值&#xff0c;要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。 若队列为空&#xff0c;pop_front 和 max_value 需要返回 -1 示例1 输入: ["MaxQueue",&qu…

【Segment Anything Model】四:预处理自己的数据集接入SAM

文章目录 1️⃣预备知识2️⃣实现思路&#x1f538;脚本预处理得到包含embedd和GT的npz&#x1f538;编写Dataset类3️⃣代码&#x1f538;实现脚本预处理得到包含embedd和GT的npz代码&#x1f538;实现Dataset的代码 1️⃣预备知识 欢迎订阅本专栏&#xff08;为爱发电&#…

Kubernetes(K8s)从入门到精通系列之十一:安装kubeadm

Kubernetes K8s从入门到精通系列之十一&#xff1a;安装kubeadm 一、准备工作二、确保每个节点上 MAC 地址和 product_uuid 的唯一性三、检查网络适配器四、检查所需端口五、安装容器运行时六、安装 kubeadm、kubelet 和 kubectl七、配置 cgroup 驱动程序 一、准备工作 一台兼…

百度秋招攻略,百度网申笔试面试详解

百度秋招简介 作为行业巨头&#xff0c;百度向社会提供的岗位一直都是非常吃香的&#xff0c;每年也都有很多考生密切关注&#xff0c;百度发布的招聘广告&#xff0c;以尽可能的让自己进入这家企业工作&#xff0c;实现自己的人生价值。那么百度每年的秋招时间是多久&#xf…

C++学习——认识什么是STL以及string类的使用

一&#xff1a;认识STL 1.什么是STL 在日常的程序编写当中&#xff0c;假如我们需要交换两个数据就必须手动书写一个交换函数&#xff0c;之后再进行传参。这样才可以实现两个数据的交换。在很多情况下也是如此&#xff0c;我们通常需要的功能还得自己来写&#xff0c;写完之后…

图数据库和知识图谱

图数据库和知识图谱之间存在密切的关系&#xff0c;但它们是两个不同的概念。 图数据库&#xff1a; 图数据库是一种特殊类型的数据库&#xff0c;用于存储和管理图形数据结构。图数据库的核心概念是图&#xff08;Graph&#xff09;&#xff0c;它由节点&#xff08;Nodes&…

PHP序列化,反序列化

一.什么是序列化和反序列化 php类与对象 类是定义一系列属性和操作的模板&#xff0c;而对象&#xff0c;就是把属性进行实例化&#xff0c;完事交给类里面的方法&#xff0c;进行处理。 <?php class people{//定义类属性&#xff08;类似变量&#xff09;,public 代表可…