分類技術根據記錄所處的環境不同而分為內部分類和外部分類兩大類。內部分類是指分類期間全部數據都存放在記憶體的分類方法;外部分類則是針對大量記錄而言的,分類期間,全部記錄已不能同時存放在記憶體,需要記錄在內、外存之間移動。歸併分類是分治法中的一種算法,屬於內部分類技術。若果用分治策略來設計分類算法,則可使最壞情況下時間變為O(nlogn),這樣的算法稱為歸併分類算法,也稱為二路歸併分類算法。
基本介紹
- 中文名:歸併分類
- 外文名:Merge sort
- 別名:二路歸併分類
- 算法策略:分治策略
- 時間複雜度:O(nlogn)
- 缺點:分類效率不高
定義
分類
檔案的物理表示法
分類技術
算法
基本思想
程式
# include "sort.h"
getdata(int a[]);
void output(int a[],int first,int last);
void mersort(int a[],int b[],int s,int t);
void merge(int a[],int l,int m,int n,int c[]);
void main(){
int arr[MAX],arrb[MAX],n;
n=getdata(arr);
output(arr,l,n);
printf("\n");
mersort(arr,arrb,l,n);
output(arrb,l,n);
printf("\n");
}
void mersort(int a[],int b[],int s,int t){
int i;
if(s==t)return;
else{
mersort(a,b,s,(s+t)/2);
mersort(a,b,(s+t)/2+1,t);
mersort(a,s,(s+t)/2,t,b);
for(i=s;i<=t;i++)
a[i]=b[i];
}
}
}
void merge(int a[],int l,int m,int t,int c[]){
int i,j,k,i1;
i=l;
j=m+1;
k=l-1;
while(i<=m && j<=n){
k++;
if(a[i]<=a[j]){
c[k]=a[i];
i++;
}
else{
c[k]=a[j];
j++;
}
}
if(i<=m)
for(i1=k+1,i1<=n;i1++){
c[i1]=a[i];
i++;
}
if(j<=n)
for(i1=k+1;i1<=n;i1++){
c[i1]=a[j];
j++;
}
}
算法分析
改進的歸併分類算法
改進算法1
MERGESORT1 (A,low,high,p)
if high-low+1<16
then INSERTIONSORT (A,LINK,low,high,p)
else{
mid=(low+high)/2; /*求這個集合的分割點*/
MERGESORT1 (low,mid,p); /*返回q表*/
MERGESORT1 (mid+1,high,r); /*返回r表*/
MERGE1 (q,r,p) /*將表q和r歸併成表p*/
改進算法2
MERGE1 (A,p,r,q)
i=q;
j=r;
k=0;
while i≠0 and j≠0
do{
if A[i]<=A[j]
then{
LINK[k]=i;
k=i;
i=LINK[i];
}
else{
LINK[k]=j;
k=j;
j=LINK[j];
}
}
if i=0
then LINK[k]=j;
else
LINK[k]=i;
p=LINK[0];