合并两个已排序的表 :实现两个已排序的表进行排序合并。
void Merge(int A[],int p,int q,int r)
{
int B[r+1];
int s = p, t = q + 1, k = p;
while((s<=q)&&(t<=r)){
if(A[s]<=A[t]){ //设置条件判断,如果左表的值小于右表的值,将该值放进新的表中
B[k] = A[s];
s++;
}
else{
B[k] = A[t];
t++;
}
k++;
}
if(s==q+1) //合并右边
while(t<=r){
B[k] = A[t];
k++;
t++;
}
else //合并左边
while(s<=q){
B[k] = A[s];
k++;
s++;
}
while(p<=r){
A[p] = B[p];
p++;
}
}
自底向上合并:满足条件则调用Merge函数合并两个表。
void BottmoUpSort(int A[],int n)
{
int t = 1, s, i;
while(t<n){
s = t;
t = 2 * s;
i = 0;
while(i+t<=n){
Merge(A,i,i+s-1,i+t-1);
i = i + t;
}
if(i+s-1<n) Merge(A,i,i+s-1,n);//检查有没有剩下的
}
}
代码如下
#include <stdio.h>
#include <stdlib.h>
void Merge(int A[],int p,int q,int r)
{
int B[r+1];
int s = p, t = q + 1, k = p;
while((s<=q)&&(t<=r)){
if(A[s]<=A[t]){
B[k] = A[s];
s++;
}
else{
B[k] = A[t];
t++;
}
k++;
}
if(s==q+1)
while(t<=r){
B[k] = A[t];
k++;
t++;
}
else
while(s<=q){
B[k] = A[s];
k++;
s++;
}
while(p<=r){
A[p] = B[p];
p++;
}
}
void BottmoUpSort(int A[],int n)
{
int t = 1, s, i;
while(t<n){
s = t;
t = 2 * s;
i = 0;
while(i+t<=n){
Merge(A,i,i+s-1,i+t-1);
i = i + t;
}
if(i+s-1<n) Merge(A,i,i+s-1,n);
}
}
int main()
{
int A[10];
for(int i=0;i<10;i++) scanf("%d",&A[i]);
BottmoUpSort(A,9);
for(int i=0;i<10;i++) printf("%d " ,A[i]);
return 0;
}
程序实现: