常用排序算法之MERGE法與BUTTOMUPSORT法(C語言實現)

一、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)

發佈了24 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章