Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7100
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 41
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-28 21:26
个人简介

You're Beautiful

文章分类

全部博文(4)

文章存档

2013年(4)

我的朋友

分类: C/C++

2013-11-05 18:03:15

分治法: 将原问题分解成N个规模较小而结构与自身相似的子问题,通过递归调用算法本身来解决每个子问题,并将子问题的解合并成原问题的解。

合并排序:
            分解:将N个元素分成各含N/2个元素的子序列
            解决:用合并排序分别对两个子序列递归地排序
            合并:合并两个已排序的子序列

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. /**
  5. *用于将两个数组合并
  6. *参数:
  7. *    Array:需排序的原数组,p、q、r用于限定子序列在数组中的位置
  8. *    p:    第一个子序列的起始下标
  9. *    q:    第一个子序列的结束下标
  10. *    r:    第二个子序列的结束下标,起始下标为q + 1
  11. */
  12. void Merge(int *Array, int p, int q, int r)
  13. {
  14.     int *firstArray;        //用于存数组的前半部分
  15.     int *secondArray;        //用于存数组的后半部分
  16.     int i, j, k, firstNum, secNum;
  17.     
  18.     firstNum = q - p + 1;    //第一个数组元素个数
  19.     secNum = r - q;            //第二个数组元素个数

  20.     firstArray = (int *)malloc(firstNum * sizeof(int));
  21.     secondArray = (int *)malloc(secNum * sizeof(int));

  22.     memcpy(firstArray, Array + p, firstNum * sizeof(int));        //分别复制两个数组的元素
  23.     memcpy(secondArray, Array + p + firstNum, secNum * sizeof(int));

  24.     for (i = 0, j = 0, k = 0; i < firstNum && j < secNum; ) {    // 将两个数组合并
  25.         if (firstArray[i] > secondArray[j])    
  26.             Array[p + k++] = secondArray[j++];
  27.         else
  28.             Array[p + k++] = firstArray[i++];
  29.     }

  30.     if (k < r - p + 1) {                                //一个数组中的元素完全插入后,将另一个数组中剩下的数复制过去
  31.         if(i == firstNum)
  32.             memcpy(Array + p + k, secondArray + j, (secNum - j) * sizeof(int));
  33.         else
  34.             memcpy(Array + p + k, firstArray + i, (firstNum - i) * sizeof(int));
  35.     }

  36. }

  37. /**
  38. *合并排序
  39. *参数:    
  40. *    Array:需要排序的数组,子序列在数组中的位置有start、end确定
  41. *    start:子序列起始下标
  42. *    end:  子序列结束下标
  43. */
  44. void MergeSort(int *Array, int start, int end)
  45. {
  46.     int mid;
  47.     if (start < end) {    //多于一个元素的时候对数组进行排序,一个元素的时候,认为是有序的,不许要继续排序了
  48.         mid = (start + end) / 2;
  49.         MergeSort(Array, start, mid);    //对前半部分进行排序
  50.         MergeSort(Array, mid + 1, end);    //对后半部分进行排序
  51.         Merge(Array, start, mid, end);    //将两部分合并
  52.     }
  53. }


                
                




阅读(115) | 评论(0) | 转发(0) |
0

上一篇:插入排序

下一篇:Java类初始化过程

给主人留下些什么吧!~~