归并排序

 1. 2路归并排序

     给两个已经排好序的长度相等的数组a,b将排序结果记录到数组C中。

算法:取两个下标i,j分别记录数组a,和b的下标,每次那次a[i]和b[j]作比较,如果a[i]>b[j],则j++,否则i++,如果某个下标超出数组长度,则结束循环,另一个数组将其后的元素依次补到数组C后。
void p_merge(int a[],int b[],int c[],int len)
{
 int i=0,j=0;
 int temp;
 int t=0;
 if(a[0]>b[0])
 {
  temp=b[0];
  c[t++]=temp;
  j=1;
 }
 else
 {
  temp=a[0];
  c[t++]=temp;
  i=1;
 }
 while(i<len && j<len)
 {
  if(a[i]>b[j])
  {
   c[t++]=b[j++];
  }
  else
  {
   c[t++]=a[i++];
  }
 
 }
 if(i==len)
 {
  for(int tt=j;tt<len;tt++)
  {
   c[t++]=b[j++];
  }
 }
 else if(j==len)
 {
  for(int tt=i;tt<len;tt++)
  {
   c[t++]=b[i++];
  }
 }
}

2.归并排序(递归)

算法:将一个无序的数组进行分割,

       申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

  设定两个指针,最初位置分别为两个已经排序序列的起始位置

  比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

  重复步骤3直到某一指针达到序列尾

  将另一序列剩下的所有元素直接复制到合并序列尾

#include <stdio.h>
#include <stdlib.h>

void MergeSort(int array[], int first, int last);
void Merge(int array[], int p, int q, int r);

void main()
{
 int array[]={3,1,6,9,2,4,8,3};
 MergeSort(array,0,7);
 for(int i=0;i<8;i++)
 {
  printf("%d ",array[i]);
 }
}

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 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 || begin2<=end2)
 {
  if(begin1<=end1)
  {
   temp[k++] = array[begin1++];
  }
  if(begin2<=end2)
  {
   temp[k++] = array[begin2++];
  }
 }
 for (i = 0;i <=(r - p); i++)
  array[p+i] = temp[i];
  free(temp);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值