归并排序算法

来源:互联网 发布:keep软件注册昵称格式 编辑:程序博客网 时间:2024/06/06 03:48

  归并排序是一种较为常用的排序算法,其时间复杂度最坏情况和平均情况均为nlgn,与快速排序相同,它也是一种基于分治思想的排序算法。

  它的基本思路是把数组分成A、B两个组,如果这两组的数据是有序的,那么就可以对这两组数据进行合并,继而完成排序。

  那么,最关键的问题就变成了如何使得A、B两组数据有序呢?归并排序的思想就是把A、B两组数据分别再分成两组,依次类推,直到小组数据只有一个的时候,就认为此时的小组数据是有序的,然后对小组数据进行合并,完成排序。

  假设我们要对数组a[8]={1,5,2,4,6,3,2,6}进行归并排序,为了直观,下图给出归并排序的图示过程:

这里写图片描述

  归并排序分成分成3步:

  • 分解子问题
  • 递归解决子问题
  • 合并已经求解的子问题

  下面给出归并排序的C语言实现,也可以访问我的github下载源代码:

#include<stdio.h>#define SIZE 40//合并数组的前半部分和后半部分, 前提就是前后两个子数组分别都已经排好序了void merge(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 first, int last) {    int mid = (first + last)/2;    if(first < last)     {        merge_sort(a, first, mid);        merge_sort(a, mid + 1, last);        merge(a, first, mid, last);    }}//主函数int main() {    int a[SIZE];    int i;    for(i=0; i<SIZE; i++)    {        scanf("%d",&a[i]);    }    merge_sort(a, 0, SIZE-1);    for(i=0; i<SIZE; i++)    {        printf("%d ", a[i]);    }    printf("\n");    return 0;}
原创粉丝点击