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