码迷,mamicode.com
首页 > 编程语言 > 详细

二路归并排序

时间:2015-05-16 11:42:27      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

一. 题目描述

使用归并排序对n个元素进行排序。

二. 题目分析

归并排序算法是用分治策略实现对n个元素进行排序的算法。其基本思想是:

将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。

技术分享

三. 算法实现

#include <stdio.h>
#define N 7

void merge(int a[],int left,int mid,int right);

void mergeSort(int a[],int left,int right)
{
    if (left < right)
    {
        int mid = (left+right)/2;    // 从中间划分两个子序列
        mergeSort(a,left,mid);        // 对左侧子序列进行递归排序
        mergeSort(a,mid+1,right);    // 对右侧子序列进行递归排序
        merge(a,left,mid,right);    // 归并
    }
}

int b[N];
void merge(int a[],int left,int mid,int right)
{
    // 表a的两段a[left..mid]和a[mid+1..right]各自有序,将它们合并成一个有序表
    for (int m=left;m<=right;m++)
        b[m] = a[m];                    // 将a中所有元素复制到b中
    for (int i=left,j=mid+1,k=i;i<=mid&&j<=right;k++)
    {
        if(b[i]<b[j])                    // 比较b的左右两段中的元素
            a[k]=b[i++];                // 将较小值复制到a中
        else
            a[k]=b[j++];
    }
    while (i<=mid)      a[k++]=b[i++];    // 若第一个表为检测完,复制
    while (j<=right)  a[k++]=b[j++];    // 若第二个表为检测完,复制
    // 最后两个while循环只有一个会执行
}

int main()
{
    int a[] = {49,38,65,97,76,13,27};
    mergeSort(a,0,N-1);
    for (int i=0;i<N;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}

技术分享

四. 复杂度分析

归并排序的时间主要分为“分-治-合”的时间。划分子序列是在常数时间内完成,最后的归并操作又可以在线性时间内完成。因此,对长度为n的元素序列进行归并排序的时间代价为

技术分享

二路归并排序

标签:

原文地址:http://www.cnblogs.com/xwz0528/p/4507547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!