归并排序(C语言)

归并排序是排序里面常用的方法,它是由冯诺依曼发明的;

其空间复杂度为 O(n);

时间复杂度为O(n log n);

其采用一种分治的方法:解决一个给定的问题,算法一次或多次地调用自身以解决紧密相关的若干子问题;

我在这里的学习也是按照分治法的思想来进行的:

首先,对于一个数组我们可以拆分成一个个有序的数列:

比如

数列1:2 4 5 7;

数列2:1 2 3 6;

这里我们可以再创建一个空数列,从这两个数列中从前往后拿小的一个放进去,最后这两个数列为空的时候,新的数列就是有序数列;

这里我写出一部分演变步骤:

主:{}

①:2 4 5 7 ② :1 2 3 6

↓

主:{1,}

①:2 4 5 7 ② :2 3 6

↓

主:{1,2}

①:4 5 7 ② :2 3 6

↓

…………

↓

主:{1,2,2,3,4,5,6,7}

①:      ② :

以上就是分布的过程;

我们用代码实现就是:

#include<stdio.h>

#include<stdlib.h>



int a[100] = {2,4,5,7,1,2,3,6};



void merge_1(int a[], int p, int q, int r) {

       int n1, n2, i, j, k;

       n1 = q - p +1;

       n2 = r - q;

       int left[100], right[100];

       for (i = 0; i <= n1; i++) {

              left[i] = a[p + i ];

       }

       for (j = 0; j < n2; j++) {

              right[j] = a[q + j + 1 ];

       }

       i = 0;

       j = 0;

       for (k = p; k <= r; k++) {

              if (left[i] <= right[j]&&i<n1&&j<=n2) {

                     a[k] = left[i];

                     i++;

              }

              else if(left[i] > right[j]&&i<=n1&&j<=n2) {

                     a[k] = right[j];

                     j++;

              }

       }

}



void merge_sort(int a[], int p, int r) {

       int q;

       if (p < r) {

              q = (p + r) / 2;

              merge_sort(a, p, q);

              merge_sort(a, q + 1, r);

              merge_1(a, p, q, r);

       }

}

int main() {

       int i;

       merge_sort(a, 0, 7);

       for(i=0;i<8;i++){

              printf("%d",a[i]);

       }

       return 0;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值