各种内部排序

#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);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值