鱼C论坛

 找回密码
 立即注册
查看: 4138|回复: 5

[技术交流] 归并排序

[复制链接]
发表于 2011-7-21 09:42:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬冬 于 2011-7-23 10:25 编辑
//下面两个函数全都是基于递归的的排序方法,效率都是相当不错的
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void MergeSort(int *array ,int first ,int last);//array为要排序的数组,first为要排序的开始位置,last为终止位置
void Merge(int *array,int p,int q,int r);//进行归并的函数
void Print(int *array,int begin,int end);  
void QuickSort(int *array,int fist,int last);  快排函数
int main()
{
 int a[10];
 int t;
 srand(time(NULL));
 
 for (int i=0;i<10;i++)
 {
  t=rand()%100;
  a[i]=t;
 }
 cout<<"排序前——"<<endl;
 Print(a,0,9);
// MergeSort(a,0,9);//归并
 QuickSort(a,0,9);
 cout<<"排序后——"<<endl;
 Print(a,0,9);
 return 0;
}

void Merge(int *array,int p,int q,int r)
{
 int i,k;
 int begin1,end1,begin2,end2;
 int *temp = (int *)malloc((r-p+1)*sizeof(int));
 begin1=p;
 end1=q;
 begin2=q+1;
 end2=r;
 k=0;
 while((begin1<=end1)&&(begin2<=end2))
 {
  if (array[begin1]<array[begin2])
  {
   temp[k]=array[begin1];
   begin1++;
  }
  else
  {
   temp[k]=array[begin2];
   begin2++;
  }
  k++;
 }
 while (begin1<=end1)
 {
  temp[k++]=array[begin1++];
 }
 while (begin2<=end2)
 {
  temp[k++]=array[begin2++];
 }
 for (i=0;i<=(r-p);i++)
 {
  array[p+i]=temp[i];
 }
 free(temp);
 
}
void MergeSort(int *array ,int first ,int last)
{
 int mid = 0;
 if (first <last)
 {
  mid = (first+last)/2;
  MergeSort(array,first,mid);
  MergeSort(array,mid+1,last);
  Merge(array,first , mid ,last );
 }
}

void Print(int *array,int begin,int end)//begin,end为数组索引位置
{
 for (int i=begin;i<=end;i++)
 {
  cout<<array[i]<<"  ";
 }
 cout<<endl;
}
void QuickSort(int *array,int first,int last)
{
 int base=array[first];
 int x=first,y=last;
 if (x>=y)
 {
  return;
 }
 while(x<y)
 {
  while(x<y && array[y]>=base)
  y--;
  array[x]=array[y];
  while(x<y && array[x]<=base)
  x++;
  array[y]=array[x];
 }
 
 array[y]=base;
 QuickSort(array,first,x);
 QuickSort(array,x+1,last);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-23 08:39:33 | 显示全部楼层
有点注释,或者能说一下算法的核心思想就好了
一上来就上一段代码
不是那么好理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-7-1 23:21:14 | 显示全部楼层
看看学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-8 08:32:44 | 显示全部楼层
有二路归并和三路归并一起的那种吗?他们在算法有什么不一样?还有怎么编比较次数和移动次数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-8 13:06:54 | 显示全部楼层
三路归并怎么写啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-2 11:22:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 14:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表