• 基础算法之归并排序


    归并排序也是一种常用的排序算法, 其时间复杂度为O(n*logn), 它的基础是分治的思想。

    其基本思路就是把数组分成两组A,B, 如果这两组内的数据都是有序的, 那么就可以很方便的对这两组数据进行合并排序。

    但是如何让这两组数据有序呢? 归并法的思想就是把A,B两组各自再分成两组, 依次类推, 当分出来的小组数据只有一个的时候, 即可以认为小组数据已经达到了有序

    然和合并相邻的两个小组就OK了~

    归并法的C语言实现如下:

     1 //合并数组的前半部分和后半部分, 前提就是前后两个子数组分别都已经排好序了
     2 void mergeArray(int a[], int first, int mid, int last) {
     3     
     4     int i, j, m, n;
     5     i = first, m = mid;
     6     j = mid+1, n = last;
     7     int k = 0;
     8     int temp[SIZE];
     9 
    10     while(i<=m && j<=n) {
    11         if(a[i] < a[j]) {
    12             temp[k++] = a[i++];
    13         } else {
    14             temp[k++] = a[j++];
    15         }
    16     }
    17     
    18     while(i<=m) temp[k++] = a[i++];
    19     while(j<=n) temp[k++] = a[j++];
    20     
    21     for(i=0; i<k; i++) {
    22         a[first+i] = temp[i];
    23     }
    24 
    25 }
    26 //归并排序
    27 void merge_sort(int a[], int start, int end) {
    28     int mid = (start+end)/2;
    29     if(start<end) {
    30         merge_sort(a, start, mid);
    31         merge_sort(a, mid+1, end);
    32         mergeArray(a, start, mid, end);
    33     }
    34 }

    一个简单的测试用例,代码如下:

    #include<stdio.h>
    
    #define SIZE 10
    
    //合并数组的前半部分和后半部分, 前提就是前后两个子数组分别都已经排好序了
    void mergeArray(int a[], int first, int mid, int last) {
        
        int i, j, m, n;
        i = first, m = mid;
        j = mid+1, n = last;
        int k = 0;
        int temp[SIZE];
    
        while(i<=m && j<=n) {
            if(a[i] < a[j]) {
                temp[k++] = a[i++];
            } else {
                temp[k++] = a[j++];
            }
        }
        
        while(i<=m) temp[k++] = a[i++];
        while(j<=n) temp[k++] = a[j++];
        
        for(i=0; i<k; i++) {
            a[first+i] = temp[i];
        }
    
    }
    //归并排序
    void merge_sort(int a[], int start, int end) {
        int mid = (start+end)/2;
        if(start<end) {
            merge_sort(a, start, mid);
            merge_sort(a, mid+1, end);
            mergeArray(a, start, mid, end);
        }
    }
    
    
    
    
    int main() {
        int a[SIZE];
        int i;
        printf("Please input the num:
    ");
        for(i=0; i<SIZE; i++)
        {
            scanf("%d",&a[i]);
        }
        printf("before the sort:
    ");
        for(i=0; i<SIZE; i++)
        {
            printf("%d ", a[i]);
        }
        printf("
    ");
        
        merge_sort(a, 0, SIZE-1);
    
        printf("after the sort:
    ");
        for(i=0; i<SIZE; i++)
        {
            printf("%d ", a[i]);
        }
        printf("
    ");
    }
    View Code
  • 相关阅读:
    中国大概可用NTPserver地址
    ROOT android 原则。 基于(zergRush)
    Struts2他们拦截器实例定义—登陆权限验证
    引用与指针
    address_space 从哪里来
    C++ 可以多个函数声明
    linux下远程管理利器-tmux
    内核空间和用户空间的分界 PAGE_OFFSET
    io端口
    C中程序的内存分配
  • 原文地址:https://www.cnblogs.com/beyond-Acm/p/4334145.html
Copyright © 2020-2023  润新知