插入排序和分治排序

简介:

What’s more important than performance?

> modularity

> correctness

> maintainability

> functionality

> robustness

> user-friendliness

> programmer time

> simplicity

> extensibility

> reliability

Why study algorithms and performance?

> Algorithms help us to understand scalability.

> Performance often draws the line between what is feasible and what is impossible.

> Algorithmic mathematics provides a language for talking about program behavior.

> The lessons of program performance generalize to other computing resources. 

> Speed is fun!

插入排序法(少量数据排序较好,是一种增量排序方法):O(n2)

wps_clip_image-576

说明:缩进代表程序结构,三角形代表注释,箭头表示赋值。

Running time

• The running time depends on the input: an already sorted sequence is easier to sort.

• Parameterize the running time by the size of the input, since short sequences are easier to sort than long ones.

• Generally, we seek upper bounds on the running time, because everybody likes a Guarantee.

Kinds of analyses

Worst-case: (usually)

• T(n) = maximum time of algorithm on any input of size n.

Average-case: (sometimes)

• T(n) = expected time of algorithm over all inputs of size n.

• Need assumption of statistical distribution of inputs.

Best-case: (bogus)

• Cheat with a slow algorithm that works fast on some input

 

分治排序:O(nlogn)(是一种分结合并算法或递归算法)

wps_clip_image-1253

算法:

wps_clip_image-1255

时间复杂度:

image

可以证明,其复杂度为O(nlogn)。

下面看一个例子:

有这样一组数据,{5,4,1,22,12,32,45,21},如果对它进行合并排序的话,首先将它从中间分开,这样,它就被分成了两个数组{5,4,1,22} {12,32,45,21}.

对这两个数组,也分别进行这样的操作,逐步的划分,直到不能再划分为止(每个子数组只剩下一个元素),这样,划分的过程就结束了。

划分的过程如下图所示:

  接下来,我们进行合并操作,依照上图,划分过程是从上到下进行的,而合并的过程是从下往上进行的,例如上图中,最下层{5},{4}这两个数组,如果按升序排列,将他们合并后的数组就是{4,5}。{1},{22}这两个子数组合并后是{1,22}。而{4,5}与{1,22},这两个数组同属一个分支,他们也需要进行合并,由于这两个子数组本身就是有序的,所以合并的过程就是,每次从待合并的两个子数组中选取一个最小的元素,然后把这个元素放到合并后的数组中,前面两个数组合并后就是{1,4,5,22}。依次类推,直到合并到最上层结束,这是数据的排序已经完成了。

合并的过程如下图所示。这个过程是从下往上的。

C语言实现代码如下:

 1#include <stdlib.h>
 2
 3//合并过程
 4void merge(int data[],int start,int mid,int end){
 5
 6
 7 int *tmpLeft,*tmpRight;
 8 int leftSize,rightSize;
 9 int l,r,j;
10
11    printArray(data,8);
12    printf("\n");
13    l = 0;
14    r = 0;
15    j = 0;
16    leftSize = mid - start + 1;
17    rightSize = end - mid;
18
19    tmpLeft = (int *)malloc(leftSize * sizeof(int));
20    tmpRight = (int *)malloc(rightSize * sizeof(int));
21
22 while(j < leftSize){
23        tmpLeft[j] = data[start + j];
24        j++;
25    }
26
27    j = 0;
28
29 while(j < rightSize){
30        tmpRight[j] = data[mid + 1 + j];
31        j++;
32    }
33
34    j = 0;
35
36 while(l < leftSize && r < rightSize){
37 if(tmpLeft[l] < tmpRight[r]){
38
39            data[start + j++] = tmpLeft[l++];
40
41        }else{
42
43            data[start + j++] = tmpRight[r++];
44        }
45    }
46
47 while(l < leftSize){
48        data[start + j++] = tmpLeft[l++];
49    }
50
51 while(r < rightSize){
52        data[start + j++] = tmpRight[r++];
53    }
54
55    free(tmpLeft);
56    free(tmpRight);
57}
58
59
60void merge_sort(int data[],int start,int end){
61
62 int mid;
63 if(start < end){
64 //将数组划分
65        mid = (start + end) / 2;
66        merge_sort(data,start,mid);
67        merge_sort(data,mid + 1,end);
68 //合并划分后的两个数组
69        merge(data,start,mid,end);
70    }
71
72}

本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2009/12/04/1617303.html,如需转载请自行联系原作者


相关文章
|
4天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1106 0
|
3天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
529 10
|
13天前
|
人工智能 运维 安全
|
12天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
4天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
301 0
|
11天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
12天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
807 23
|
4天前
|
缓存 供应链 监控
VVIC seller_search 排行榜搜索接口深度分析及 Python 实现
VVIC搜款网seller_search接口提供服装批发市场的商品及商家排行榜数据,涵盖热销榜、销量排名、类目趋势等,支持多维度筛选与数据分析,助力选品决策、竞品分析与市场预测,为服装供应链提供有力数据支撑。
|
4天前
|
缓存 监控 API
Amazon item_review 商品评论接口深度分析及 Python 实现
亚马逊商品评论接口(item_review)可获取用户评分、评论内容及时间等数据,支持多维度筛选与分页调用,结合Python实现情感分析、关键词提取与可视化,助力竞品分析、产品优化与市场决策。