#include"sort.h"
#include<stdlib.h>
#include<stdio.h>
/*插入排序:1.直接插入 2.折半插入 3.2_路插入 4.希尔插入*/
/*直接插入排序*/
void InsertSort(SqList l)
{
int i,j;
for(i=2;i<=l.length;++i)
if(l.r[i].key<l.r[i-1].key)
{
l.r[0]=l.r[i];//复制为哨兵
for(j=i-1;j>0&&l.r[0].key<l.r[j].key;--j)
l.r[j+1]=l.r[j];//记录后移
l.r[j+1]=l.r[0];//插入
}
prin(l);
}
/*折半插入排序*/
void BInsertSort(SqList l)
{
int i,j,m,low,high;
for(i=2;i<=l.length;i++)
{
l.r[0]=l.r[i];
low=1;
high=i-1;
while(low<=high)
{
m=low+(high-low)/2;
if(l.r[0].key<l.r[m].key)
high=m-1;
else low=m+1;
}
for(j=i-1;j>=high+1;j--)
l.r[j+1]=l.r[j];//记录后移
l.r[high+1]=l.r[0];
}
prin(l);
}
/*2路插入排序*/
void P2_InsertSort(SqList l)
{
int i,j,first,final;
redtype *d;
d=(redtype*)malloc(l.length*sizeof(redtype));//生成length个记录临时空间
d[0]=l.r[1];
first=final=0;
for(i=2;i<=l.length;i++)//依次将l的元素插入d中
if(l.r[i].key<d[first].key)//待排元素小于最小
{
first=(first-1+l.length)%l.length;//设d为循环向量
d[first]=l.r[i];
}
else if(l.r[i].key>d[final].key)//待排元素大于最大
{
final=final+1;
d[final]=l.r[i];
}
else {
j=final++;
while(l.r[i].key<d[j].key)
{
d[(j+1)%l.length]=d[j];
j=(j-1+l.length)%l.length;
}
d[j+1]=l.r[i];
}
for(i=1;i<=l.length;i++)
l.r[i]=d[(i+first-1)%l.length];
prin(l);
}
void prin(SqList l)
{
int i;
for(i=1;i<=l.length;i++)
printf("(%d %d) ",l.r[i].key,l.r[i].otherinfo);
printf("\n");
}
/*希尔插入排序*/
void ShellInsertSort(SqList l)
{
int dk,i,j;
for(dk=l.length/2;dk>=1;dk=dk/2)//控制增量长度
{for(i=dk+1;i<=l.length;++i)//从dk+1开始向后遍历
if(l.r[i].key<l.r[i-dk].key)
{
l.r[0]=l.r[i];
for(j=i-dk;j>0&&l.r[0].key<l.r[j].key;j-=dk)
l.r[j+dk]=l.r[j];//记录后移,查找插入位置
l.r[j+dk]=l.r[0];//插入
}
prin(l);
}
}
/*交换排序:1.冒泡排序 2.快速排序*/
/*冒泡排序*/
void BubbleSort(SqList l)
{
redtype t;
int i,j;
for(i=1;i<l.length;i++)
for(j=i+1;j<=l.length;j++)
if(l.r[j].key<l.r[i].key)
{
t=l.r[j];
l.r[j]=l.r[i];
l.r[i]=t;
}
prin(l);
}
/*快速排序*/
void QuickSort(SqList *l,int low,int high)
{
int pos;
if(low<high)
{
pos=Partion(l,low,high);
QuickSort(l,low,pos-1);
QuickSort(l,pos+1,high);
}
}
int Partion(SqList *l,int low,int high)
{
int piv=l->r[low].key;
l->r[0]=l->r[low];
while(low<high)
{
while(low<high&&l->r[high].key>=piv) --high;
l->r[low]=l->r[high];
while(low<high&&l->r[low].key<=piv) ++low;
l->r[high]=l->r[low];
}
l->r[low]=l->r[0];
return low;
}
/*选择排序:1.简单选择 2.堆排序*/
/*简单选择排序*/
void SelectSort(SqList l)
{
int i,j,k;
for(i=1;i<l.length;i++)
{
l.r[0]=l.r[i];
for(j=i+1;j<=l.length;j++)
if(l.r[j].key<l.r[k].key) k=j;
l.r[i]=l.r[k];
l.r[k]=l.r[0];
}
prin(l) ;
}
/*堆排序*/
void HeapSort(SqList l)
{
redtype t;
int i;
for(i=l.length/2;i>0;i--)//把l.[1..l.length]构建成大顶堆
HeapAdjust(&l,i,l.length);
for(i=l.length;i>1;i--)
{
t=l.r[1];
l.r[1]=l.r[i];
l.r[i]=t;
HeapAdjust(&l,1,i-1);//将l.r[1..i-1]重新调整为大顶堆
}
prin(l);
}
void HeapAdjust(SqList *l,int s,int m)//调整l.r[s...m]成一个大顶堆
{
redtype t;
int i;
t=l->r[s];
for(i=2*s;i<m;i*=2)//沿key较大的子节点向下筛选
{
if(i<m&&l->r[i].key<l->r[i+1].key)
++i;
if(t.key>=l->r[i].key) break;//筛选结束
l->r[s]=l->r[i];//t应插入在s上
s=i;//修改s值,以便继续向下筛选
}
l->r[s]=t;
}
/*归并排序*/
void Merge(redtype a[],redtype *b,int low,int mid,int high)//main函数中动态申请l.length+1个red大小内存
{
int i,j,k;
for(i=low;i<=high;i++)
b[i]=a[i];
for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++)
{
if(b[i].key<b[j].key) a[k]=b[i++];
else a[k]=b[j++];
}
while(i<=mid) a[k++]=b[i++];
while(j<=high) a[k++]=b[j++];
}
void MergeSort(redtype a[],redtype b[],int low,int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
MergeSort(a,b,low,mid);
MergeSort(a,b,mid+1,high);
Merge(a,b,low,mid,high);
}
}
各种内部排序
最新推荐文章于 2023-05-12 21:02:39 发布