设为首页 加入收藏

TOP

c/c++常用算法-- 基本排序算法(一)
2014-02-08 13:36:04 来源: 作者: 【 】 浏览:159
Tags:c/c 常用 算法 --  基本 排序

  归并(Merging) :是指将两个或两个以上的有序序列合并成一个有序序列。若采用线性表(无论是那种存储结构)易于实现,其时间复杂度为O(m+n)。

  归并思想实例:两堆扑克牌,都已从小到大排好序,要将两堆合并为一堆且要求从小到大排序。

  ◆ 将两堆最上面的抽出(设为C1,C2)比较大小,将小者置于一边作为新的一堆(不妨设C1

  ◆重复上述过程,直到某一堆已抽完,然然后将剩下一堆中的所有牌转移到新堆中。

  1 排序思想

  ① 初始时,将每个记录看成一个单独的有序序列,则n个待排序记录就是n个长度为1的有序子序列;

  ② 对所有有序子序列进行两两归并,得到én/2ù个长度为2或1的有序子序列——一趟归并;

  ③ 重复②,直到得到长度为n的有序序列为止。

  上述排序过程中,子序列总是两两归并,称为2-路归并排序。其核心是如何将相邻的两个子序列归并成一个子序列。设相邻的两个子序列分别为:

  {R[k], R[k+1], …,R[m]}和{R[m+1],R[m+2],…,R[h]},将它们归并为一个有序的子序列:

  {DR[l],DR[l+1],…,DR[m], DR[m+1], …,DR[h] }

  2.举例

  3.实现代码:

  [cpp] view plaincopy

  //  // main.cpp

  // CHelloWorld

  //

  // Created by IDEA-MAC03 on 13-12-16.

  // Copyright (c) 2013年 IDEA-MAC03. All rights reserved.

  //

  #include

  #include

  #define SIZE 15

  //完成一遍合并的函数

  void MergeOne(int a[],int b[],int n,int len)

  {

  int i,j,k,s,e;

  s = 0;

  while (s + len < n)

  {

  e = s+ 2*len -1;

  if (e >= n)

  {

  e = n-1;

  }

  //相邻有序合并

  k = s;

  i = s;

  j = s + len;

  while (i < s+len && j<= e)

  {

  if (a[i]<= a[j])

  {

  b[k++] = a[i++];

  }

  else

  {

  b[k++] = a[j++];

  }

  }

  while (i < s+len)

  {

  b[k++] = a[i++];

  }

  while (j<= e)

  {

  b[k++] = a[j++];

  }

  s = e + 1;

  }

  if (s

  {

  for (; s

  {

  b[s] = a[s];

  }

  }

  }

   

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇全排列之字典序法 下一篇最小生成树算法Prim算法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)