认知算法(九)

简介: 认知算法(九),一起来学习吧。

嗨,欢迎来到异星球,我是小怪同志。这篇文章主要讲认识算法,请一起学习吧。

一、归并排序

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:

自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
自下而上的迭代;
在《数据结构与算法 JavaScript 描述》中,作者给出了自下而上的迭代方法。但是对于递归法,作者却认为:

However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle.

然而,在 JavaScript 中这种方式不太可行,因为这个算法的递归深度对它来讲太深了。

说实话,我不太理解这句话。意思是 JavaScript 编译器内存太小,递归太深容易造成内存溢出吗?还望有大神能够指教。

和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。

  1. 算法步骤
    1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

    2.设定两个指针,最初位置分别为两个已经排序序列的起始位置;

    3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

    4.重复步骤 3 直到某一指针达到序列尾;

    5.将另一序列剩下的所有元素直接复制到合并序列尾。

二、代码实现

int min(int x, int y) {

return x < y ? x : y;

}
void merge_sort(int arr[], int len) {

int *a = arr;
int *b = (int *) malloc(len * sizeof(int));
int seg, start;
for (seg = 1; seg < len; seg += seg) {
    for (start = 0; start < len; start += seg * 2) {
        int low = start, mid = min(start + seg, len), high = min(start + seg * 2, len);
        int k = low;
        int start1 = low, end1 = mid;
        int start2 = mid, end2 = high;
        while (start1 < end1 && start2 < end2)
            b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
        while (start1 < end1)
            b[k++] = a[start1++];
        while (start2 < end2)
            b[k++] = a[start2++];
    }
    int *temp = a;
    a = b;
    b = temp;
}
if (a != arr) {
    int i;
    for (i = 0; i < len; i++)
        b[i] = a[i];
    b = a;
}
free(b);

}

相关文章
|
6月前
|
安全 测试技术
认识-认知
认识-认知
101 0
|
Kubernetes 负载均衡 网络协议
K8S 的新认知与初领会
我们今天开始正式进⼊ Kubernetes 的课程学习,Kubernetes 相信各位已经听过很多次了,那么什么是 Kubernetes呢?
K8S 的新认知与初领会
|
存储 算法 搜索推荐
认知算法(三)
认知算法(三),一起来学习吧。
认知算法(三)
|
机器学习/深度学习 算法 搜索推荐
认知算法(一)
认识算法(一),一起来学习吧。
|
机器学习/深度学习 存储 算法
认知算法(四)
认知算法(四),一起来学习吧。
|
存储 算法 搜索推荐
认知算法(六)
认知算法(六),一起来学习吧。
认知算法(二)
认知算法(二),一起来学习吧。
|
算法 搜索推荐
认知算法(十)
认知算法(十),一起来学习吧。
|
算法 搜索推荐
认知算法(五)
认知算法(五),一起来学习吧。
|
算法 搜索推荐 索引
认知算法(七)
认知算法(七),一起来学习吧。
下一篇
无影云桌面