首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mergesort C实现

Mergesort是一种常见的排序算法,它采用分治的思想,将待排序的数组不断拆分为更小的子数组,然后再将这些子数组合并成有序的数组。以下是mergesort C实现的示例代码:

代码语言:c
复制
#include <stdio.h>

// 合并两个有序数组
void merge(int arr[], int left, int mid, int right) {
    int i, j, k;
    int n1 = mid - left + 1;
    int n2 = right - mid;

    // 创建临时数组
    int L[n1], R[n2];

    // 将数据复制到临时数组
    for (i = 0; i < n1; i++)
        L[i] = arr[left + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[mid + 1 + j];

    // 合并临时数组
    i = 0;
    j = 0;
    k = left;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    // 复制剩余元素
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}

// 归并排序
void mergeSort(int arr[], int left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;

        // 分割数组
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);

        // 合并数组
        merge(arr, left, mid, right);
    }
}

// 打印数组
void printArray(int arr[], int size) {
    int i;
    for (i = 0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

int main() {
    int arr[] = {12, 11, 13, 5, 6, 7};
    int arr_size = sizeof(arr) / sizeof(arr[0]);

    printf("原始数组:\n");
    printArray(arr, arr_size);

    mergeSort(arr, 0, arr_size - 1);

    printf("排序后的数组:\n");
    printArray(arr, arr_size);
    
    return 0;
}

这段代码实现了mergesort算法的C语言版本。它首先定义了两个辅助函数:merge用于合并两个有序数组,mergeSort用于递归地拆分和合并数组。最后,在main函数中,我们定义了一个待排序的数组,并调用mergeSort函数对其进行排序。

Mergesort的优势在于其稳定的时间复杂度O(nlogn),适用于大规模数据的排序。它的应用场景包括但不限于排序算法的研究、数据分析、数据库查询优化等。

腾讯云提供了多种云计算相关产品,其中与排序算法相关的产品包括云服务器、云数据库MySQL、云函数等。您可以通过访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于这些产品的详细信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言链表实现

下面一部分的讨论都将围绕上面这幅图片展开,既然是逐步实现,我不考虑在开头就让这个单链表完美实现,它将只有两个部分:链表的创建&遍历链表输出 首先我们要知道一些简单的概念,一个链表是由节点构成,而每个节点又是又一个数据域和一个指向下一个节点的指针构成...这个疑问你可以自己解答比较好 动态单链表实现 到这里一个简单的链表就已经实现了,但是我们还需要继续改进,因为我们有时候不知道每个节点储存的数据,所以我们就需要一个动态链表了,下面这个将实现把用户输入的数据以链式结构储存...int data; struct NODE *next; struct NODE *pre; }node; int main(){ node *a=new node,*b=new node,*c=...new node; node *head=a; node *tail=c; a->data=9; a->next=b; a->pre=NULL; b->data=17; b->next=...c; b->pre=a; c->data=6; c->next=NULL; c->pre=b; //输出 /*node *print_head=head; while(print_head

5.4K30

C++ string实现

string经典实现 作为C++从业者,我相信都会被考察过实现简单的string类,包括构造、析构、拷贝构造以及赋值拷贝等,因为这能够很好的考察面试者的C++基本功。...如果不实现判断就进行赋值,那么赋值前会释放自身空间,那么传入参数的内存也同时被释放,将再也找不到需要赋值的内容。...考虑异常安全 上面是实现使用于C++初级程序员,但对于C++高级程序员来说还需要考虑异常安全性。...前面的实现中,我们在分配内存之前释放了m_data的内存,如果此时内存不足导致new char抛出异常,m_data将是一个空指针,这样非常容易导致程序崩溃。...代码实现如下: string& operator = (const string& rhs) { if (this !

1.3K01

C++练手】C++实现单链表

前几天找实习的时候,一个面试官给我留了一个题,做一个链表demo,要求实现创建、插入、删除等操作。...链表是一种常见的数据结构,它是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。...我是用C++代码来写的。首先,定义一个linklist.h文件,该文件定义了链表的结点和链表支持的方法。如下所示: //linklist.h:定义链表结点和方法。...如下所示: //linklist.cpp:链表方法的实现。...其实用C++实现链表的功能,基本上就是用来练手用,在C++的模版里面已经有很多实现了,作为练手的小练习还是挺有意思的。勤快的小伙伴可以对着代码调试起来,加强自己基本功的练习。

1.2K70

WebSocket协议详解与c++&c#实现

现在主流的PC浏览器以及手机浏览器对websocket都实现了非常成熟的支持。...Websocket协议有着统一的标准的,所有websocket通讯无论实现的语言如何,无论使用的终端如何,最终都是一致的。...Websocket相对于http是长连接的,这样就可以实现实时的推送消息。 Websocket既能支持文本格式也可以支持二进制格式,这样无论是js还是c++,都可以适当的选择自己喜欢的数据格式。...再游戏行业,服务器一般都是使用C++专门开发的网络程序,常规的一般都是使用比较传统的二进制协议,现在想用websocket的人越来越多,但是可以用于服务器端的websocket库却很少,要不就是库太重量级依赖了太多不需要的模块要不就是绑定了特定的网络接口实现...全部实现就在一个头文件里,集成不能再容易了。 目前提供C++和c#的实现。别的语言我就没空写了,刚兴趣的可以照猫画虎来一个。

1.6K10

简谈归并排序

具体内容还是从算法实现思想、时间复杂度、算法稳定性以及算法实现四个方面介绍。...1 算法实现思想 1、第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列; 2、第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置; 3、第三步:比较两个指针所指向的元素...35} 比较次数:4 第三次归并后:{2,4,8,35,80,189,290} 比较次数:4 总比较次数:3+4+4 = 11 3 时间复杂度 O(n log n) 4 算法稳定性 : 稳定 5 算法实现...C语言实现 void Merge(int sourceArr[], int tempArr[], int startIndex, int midIndex, int endIndex){...); Merge(sourceArr, tempArr, startIndex, midIndex, endIndex); } } Objective-C语言实现 - (

60960
领券