一、插入排序
1.直接插入排序
#define SIZE 100
typedef struct DataNode{
int key;
int data;
}DataNode;
typedef struct Table{
DataNode *table;
int length;
}Table,*LinkTable;
void init(LinkTable &l){
l=new Table;
l->table=new DataNode[SIZE];
l->length=0;
}
void InsertSort(LinkTable l){
int i,j;
for(i=2;i<=l->length;i++)
if(l->table[i].key<l->table[i].key){
*l->table[0]=*l->table[i];
for(j=i-2;l->table[0].key<l->table[j].key;j--)
*l->table[j+1]*l->table[j];
*l->table[j+1]=*l->table[0];
}
}
2.折半插入排序
void BInsertSort(LinkTable l){
int i,j,low,high,mid;
for(i=2;i<=l->length;i++)
if(l->table[i].key<l->table[i-1].key){
*l->table[0]=*l->table[i];
low=1;high=i-1;
while(low<=high){
mid=(low+high)/2;
if(l->table[mid].key<l->table[0].key)high=mid-1;
else low=mid+1;
}
for(j=i-1;j>=high+1;j--)*l->table[j+1]=*l->table[j];
*l->table[j+1]=*l->table[0];
}
}
3.希尔排序
void ShellInsert(LinkTable l,int dk){
int i,j;
for(i=dk+1;i<l->length;i+=dk)
if(l->table[i].key<l->table[i-dk].key){
*l->table[0]=*l->table[i];
for(j=i-dk;j>0 && l->table[j].key<l->table[0].key;j-=dk)
*l->table[j+dk]=*l->table[j];
*l->table[j+dk]=*l->table[0];
}
}
void ShellSort(LinkTable l,int dt[],int t){
for(int k=0;k<t;k++)ShellInsert(l,dt[k]);
}
二、交换排序
1.冒泡排序
void BubbleSort(LinkTable l){
int m,flag,j;
flag=1;
m=l->length-1;
while((m>0) && flag==1){
flag=0;
for(j=1;j<=m;j++){
if(l->table[j].key>l->table[j+1].key){
flag=1;
*l->table[0]=*l->table[j];
*l->table[j]=*l->table[j+1];
*l->table[j+1]=*l->table[0];
}
m--;
}
}
}
2.快速排序
int Partion(LinkTable l,int low,int high){
int key=l->table[low].key;
l->table[0]=l->table[low];
while(low<high){
while(l->table[high].key>=key)--high;
*l->table[low]=*l->table[high];
while(l->table[low].key<=key)--low;
*l->table[high]=*l->table[low];
}
*l->table[low]=*l->table[0];
return low;
}
void QSort(LinkTable l,int low,int high){
int mid;
if(low<high){
mid=Partion(l,low,high);
QSort(l,low,mid-1);
QSort(l,mid+1,high);
}
}
void QuickSort(LinkTable l){
QSort(l,1,l->length);
}
三、选择排序
1.简单选择排序
void SelectSort(LinkTable t){
int i,j,k;
for(i=1;i<t->length;i++){
k=i;
for(j=i+1;j<=t->length;j++)
if(t->table[j].key<t->table[k].key)k=j;
if(k!=i){
*t->table[0]=*t->table[i];
*t->table[i]=*t->table[k];
*t->table[k]=*t->table[0];
}
}
}
2.树形选择排序
3.堆排序
堆调整
void HeapAdjust(LinkTable l,int s,int m){
int j;
*l->table[0]=*l->table[s];
for(j=2*s;j<=m;j*=2){
if(j<m && l->table[j].key<l->table[j+1].key)++j;
if(l->table[0].key>=l->table[j].key)break;
*l->table[s]=*l->table[j];
s=j;
}
*l->table[s]=*l->table[0];
}
堆创建
void createHeap(LinkTable &l){
int n=l->length,i;
for(i=n/2;i>=1;i--)
HeapAdjust(l,i,n);
}
堆排序
void HeapSort(LinkTable l){
int i;
createHeap(l);
for(i=l->length;i>1;i--){
*l->table[0]=*l->table[1];
*l->table[1]=*l->table[i];
*l->table[i]=*l->table[0];
HeapAdjust(l,1,i-1);
}
}
四、归并排序
#define SIZE 100
typedef struct DataNode{
int key;
int data;
}DataNode;
typedef struct Table{
DataNode *table;
int length;
}Table,*LinkTable;
void init(LinkTable l){
l=new Table;
l->table=new DataNode[SIZE];
l->length=0;
}
void merge(DataNode *r,DataNode *t,int low,int mid,int high){
int i,j,k;
i=low; j=mid+1; k=low;
while(i<=mid && j<=high){
if(r[i].key<=r[j].key)t[k++]=r[i++];
else t[k++]=r[j++];
}
while(i<=mid)t[k++]=r[i++];
while(j<=mid)t[k++]=r[j++];
}
void MSort(DataNode *r,DataNode *t,int low,int high){
DataNode *s;
s=new DataNode[SIZE];
if(low==high)t[low]=r[low];
else{
int mid=(low+high)/2;
MSort(r,s,low,mid);
MSort(r,s,mid+1,high);
Merge(s,t,low,mid,high);
}
}
void mergeSort(LinkTable l){
MSort(l->table,l->table,1,l->length);
}
五、基数排序
#define MAXNUM_KEY 10
#define RADIX 10
#define MAX_SPACE 10000
typedef struct{
int keys[MAXNUM_KEY];
int data;
int next;
}SLCell;
typedef struct{
SLCell r[MAX_SPACE];
int keyNum;
int length;
}SLList;
typedef int ArrType[RADIX];
void init(SLList* &l){
l=new SLList;
l->keyNum=0;
l->length=0;
}
void Distribute(SLCell* r,int i,ArrType &f,ArrType &e){
int k,p,j;
for(j=0;j<RADIX;j++)f[j]=0;
for(p=r[0].next;p;p=r[p].next){
j=r[p].keys[i];
if(!f[j])f[j]=p;
else e[j]=p;
e[j]=p;
}
}
void Collect(SLCell* r,int i,ArrType &f,ArrType &e){
int j=0,k;
while(!f[j])j++;
r[0].next=f[j];
k=e[j];
while(j<RADIX-1){
j++;
if(f[j]){
r[k].next=f[j];
k=e[j];
}
}
r[k].next=0;
}
void RadixSort(SLList* l){
int i;ArrType f,e;
for(i=0;i<l->length;i++)l->r[i].next=i+1;
l->r[i].next=0;
for(i=0;i<l->keyNum;i++){
Distribute(l->r,i,f,e);
Collect(l->r,i,f,e);
}
}
六、外部排序
1.多路平衡归并
2.置换选择排序
3.最佳归并树