6-1集計ソート(10点)
11447 ワード
本題では,並べ替えられるシーケンスの長さ1<=n<=1000の2ウェイ並べ替えにおける並べ替え動作を実現することを要求する.関数インタフェースの定義:
void Merge(SqList L,int low,int m,int high);
ここで、Lはソート対象テーブルであり、ソート後のデータを小さいものから大きいものに並べ替える.タイプ定義:
サンプルを入力:
最初の行の整数は、ソートに参加するキーワードの数を表します.2行目はキーワード値です.たとえば、次のようになります.
10 5 2 4 1 8 9 10 12 3 6
出力サンプル:
出力は小さい順から大きい順で、各キーワード間はスペースで区切られ、最後のキーワードの後ろにスペースがあります.
1 2 3 4 5 6 8 9 10 12
void Merge(SqList L,int low,int m,int high);
ここで、Lはソート対象テーブルであり、ソート後のデータを小さいものから大きいものに並べ替える.タイプ定義:
#include
#include
typedef int KeyType;
typedef struct {
KeyType *elem; /*elem[0] */
int Length;
}SqList;
void CreatSqList(SqList *L);/* , , */
void MergeSort(SqList L,int low,int high);
void Merge(SqList L,int low,int m,int high);
int main()
{
SqList L;
int i;
CreatSqList(&L);
MergeSort(L,1,L.Length);
for(i=1;i<=L.Length;i++)
{
printf("%d ",L.elem[i]);
}
return 0;
}
void MergeSort(SqList L,int low,int high)
{
/* */
int mid;
if(low<high) /* 1*/
{
mid=(low+high)/2; /* */
MergeSort(L,low,mid); /* low mid */
MergeSort(L,mid+1,high); /* mid+1 high */
Merge(L,low,mid,high); /* */
}
}
サンプルを入力:
最初の行の整数は、ソートに参加するキーワードの数を表します.2行目はキーワード値です.たとえば、次のようになります.
10 5 2 4 1 8 9 10 12 3 6
出力サンプル:
出力は小さい順から大きい順で、各キーワード間はスペースで区切られ、最後のキーワードの後ろにスペースがあります.
1 2 3 4 5 6 8 9 10 12
void Merge(SqList L,int low,int m,int high){
int p, p1, p2;
int array[1001];
p = p1 = low;
p2 = m+1;
while (p1 <=m && p2 <=high) {
if (L.elem[p1] < L.elem[p2])
array[p++] = L.elem[p1++];
else
array[p++] = L.elem[p2++];
}
while (p1 <=m) array[p++] = L.elem[p1++];
while (p2 <=high) array[p++] = L.elem[p2++];
int i;
for(i=low;i<=high;i++)
{
L.elem[i]=array[i];
}
}