常用排序算法之MERGE法与BUTTOMUPSORT法(C语言实现)

来源:互联网 发布:win764精简游戏优化版 编辑:程序博客网 时间:2024/05/16 17:52

一、MERGE法

   描述:对于任一给定序列(数组)array,大小为N,里面有这样两个序列序列,array[p]<=array[p+1]...<=array[q],

array[q+1]<=array[q+2]...<=array[r],其中(0<=p<=q<r<=N),对这两个子序列进行进行非降序排列。

   输入:1、数组,2、第一个序列的首尾索引,3、第二个序列的尾索引

   输出:对两个子序列排序好后的数组

   算法描述如下:

void merge(int array[],int first_head,int first_end,int second_end)
{
 int num = second_end-first_head+1;
 int *tmp_array = (int *)malloc(sizeof(int)*num);
 int i = 0;
 int s = first_head;
 int t = first_end+1;
 while(s <= first_end && t <= second_end)
 {
  if(array[s] <= array[t])
  {
   tmp_array[i] = array[s];
   s++;
  }
  else
  {
   tmp_array[i] = array[t];
   t++;
  }
  i++;
 }
 
 if(s > first_end && t <= second_end)
 {
  while(t <= second_end)
  {
   tmp_array[i]=array[t];
   t++;
   i++;
  }
 }
 if(s <= first_end && t > second_end)
 {
  while(s <= first_end)
  {
   tmp_array[i]=array[s];
   s++;
   i++;
  }
 }

 for(;num>0;num--)
 {
  array[second_end]=tmp_array[num-1];
  second_end--;
 }
 free(tmp_array);
 return;
}

 

二、BUTTOMUPSORT法

描述:对给定数组进行非降序排列

输入:任一给定数组

输出:排序后的数组

算法描述:

void bottomupsort(int array[],int array_size)
{
 int num = array_size;
 int t = 1;
 int s,i;
 while(t < num)
 {
  s = t;
  t = 2*s;
  i = 0;
  while(i+t <= num)
  {
   merge(array,i,i+s-1,i+t-1);
   i = i+t;
  }
  if(i+s < num)
  {
   merge(array,i,i+s-1,num-1);
  }
 }
 return;
}

 

三、实现测试

void main()

 int i=0;
 int num=20;
 int a[num];
 
 for(i=0;i<num;i++)
 {
  srand((int)time((time_t*)NULL));
  a[i]=(int)(20.0*rand()/(RAND_MAX+1.0));
  sleep(1);
 }
 
 for(i=0;i<num;i++)
 {
  printf("%d ",a[i]);
 }
 printf("/n");

 bottomupsort(a,num);

 for(i=0;i<num;i++)
 {
  printf("%d ",a[i]);
 }
 printf("/n");
}

 

四、测试结果

 

 

由观察可知:此算法的时间复杂度为O(nlogn),由于每调一次MERGE都得分配空间,所以空间复杂度为也为O(nlogn)

原创粉丝点击