C语言实现基本排序算法----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)

//C语言程序----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)

//调试成功运行

#include "iostream"
#include "stdlib.h"
#include "stdio.h"
#include "malloc.h"

typedef struct
{
int key;
int otherinfo;
}Redsize;

typedef struct
{
Redsize r[100];
int length;
}Sqlist;

Sqlist L;
int n;

int LT(int x,int y)
{
    if(x<y) return 1;
    else return 0;

}

void Directsort(Sqlist &L)
{
int i,j;
for(i=2;i<=L.length;i++)
   if(LT(L.r[i].key,L.r[i-1].key)){
    L.r[0]=L.r[i];
    L.r[i]=L.r[i-1];
    for(j=i-2;LT(L.r[0].key,L.r[j].key);j--)
     L.r[j+1]=L.r[j];
    L.r[j+1]=L.r[0];
   }
   for(i=1;i<=L.length;i++)
    printf("%d ",L.r[i].key);
   printf("/n");
  
}

void ShellInsert(Sqlist &L, int dk)
{ // 算法10.4
// 对顺序表L作一趟希尔插入排序。
//本算法对算法10.1作了以下修改:
// 1. 前后记录位置的增量是dk,而不是1;
//2. r[0]只是暂存单元,不是哨兵。当j<=0时,插入位置已找到。
int i,j;
for (i=dk+1; i<=L.length; ++i)
   if (LT(L.r[i].key, L.r[i-dk].key))
   { // 需将L.r[i]插入有序增量子表
    L.r[0] = L.r[i];                   // 暂存在L.r[0]
    for (j=i-dk; j>0 && LT(L.r[0].key, L.r[j].key); j-=dk)
     L.r[j+dk] = L.r[j];              // 记录后移,查找插入位置
    L.r[j+dk] = L.r[0];                // 插入
   }
} // ShellInsert

void ShellSort(Sqlist &L,int t)
{
for(;t>=1;)
{
   ShellInsert(L,t);
   t/=2;
  
}


}


void Bubblesort(Sqlist &L)
{
int i,j,flag=0,t;
for(i=1;i<L.length;i++)
{
   flag=0;
   for(j=1;j<=L.length-i;j++)
    if(L.r[j].key>L.r[j+1].key)
    {
     t=L.r[j].key;
     L.r[j].key=L.r[j+1].key;
     L.r[j+1].key=t;
     flag++;
    }
    if(flag==0) break;
}
for(i=1;i<=L.length;i++)
   printf("%d ",L.r[i].key);
printf("/n");
}

void Easysort(Sqlist &L)
{
int i,j,t;
for(i=1;i<L.length;i++)
{
   for(j=i+1;j<=L.length;j++)
    if(L.r[i].key>L.r[j].key)
    {
     t=L.r[i].key;
     L.r[i].key=L.r[j].key;
     L.r[j].key=t;
    }
}
for(i=1;i<=L.length;i++)
   printf("%d ",L.r[i].key);
printf("/n");
}


int Partition(Sqlist &L,int low,int high)
{
int pivotkey;
L.r[0]=L.r[low];          
pivotkey=L.r[low].key;     
while(low<high){          
   while(low<high&&L.r[high].key>=pivotkey) --high;
   L.r[low]=L.r[high];    
   while(low<high&&L.r[low].key<=pivotkey) ++low;
   L.r[high]=L.r[low];     
}
L.r[low]=L.r[0];  
return low;             
} // Partition

void QSort(Sqlist &L,int low,int high)
{

int pivotloc;
if(low<high)
{                       
   pivotloc=Partition(L,low,high);                                                                
   QSort(L,low,pivotloc-1);                             
   QSort(L,pivotloc+1,high);     
}

} // QSort


void HeapAdjust(Sqlist &L, int s, int m)
{ // 算法10.10
// 已知H.r[s..m]中记录的关键字除H.r[s].key之外均满足堆的定义,
// 本函数调整H.r[s]的关键字,使H.r[s..m]成为一个大顶堆
// (对其中记录的关键字而言)
int j;
Redsize rc;
rc = L.r[s];
for (j=2*s; j<=m; j*=2)
{ // 沿key较大的孩子结点向下筛选
   if (j<m && L.r[j].key<L.r[j+1].key) ++j;
   // j为key较大的记录的下标
   if (rc.key >= L.r[j].key) break;         // rc应插入在位置s上
   L.r[s] = L.r[j]; s = j;
}
L.r[s] = rc; // 插入
} // HeapAdjust

void HeapSort(Sqlist &L)
{ // 算法10.11
// 对顺序表H进行堆排序。
int i;
Redsize temp;
for (i=L.length/2; i>0; --i) // 把H.r[1..H.length]建成大顶堆
   HeapAdjust ( L, i, L.length );
for (i=L.length; i>1; --i)
{
   temp=L.r[i];
   L.r[i]=L.r[1];
   L.r[1]=temp; // 将堆顶记录和当前未经排序子序列Hr[1..i]中
   // 最后一个记录相互交换
   HeapAdjust(L, 1, i-1); // 将H.r[1..i-1] 重新调整为大顶堆
}
} // HeapSort


void main()
{
int k,i;
i=1;
printf("要对多少个数进行排序:");
scanf("%d",&n);
L.length=n;
printf("输入数据/n");
while(i<=n){
   scanf("%d",&L.r[i].key);
   i++;
}
while(1)
    {
   printf("-------------------主菜单----------------/n");
   printf("1.直接插入排序/n");
   printf("2.SHELL排序/n");
   printf("3.冒泡排序/n");
   printf("4.快速排序/n");
   printf("5.简单选择排序/n");   
   printf("6.堆排序/n");
   printf("0.退出/n");
   printf("-----------------------------------------/n");
   printf("请选择:");  
   scanf("%d",&k);
   switch(k)
   {
   case 1: Directsort(L); break;
   case 2: ShellSort(L,(L.length)/2);
     for(i=1;i<=L.length;i++)
      printf("%d ",L.r[i].key);
     printf("/n");
     break;;
   case 3: Bubblesort(L); break;
   case 4: QSort(L,1,L.length);
     for(i=1;i<=L.length;i++)
      printf("%d ",L.r[i].key);
     printf("/n");
     break;
   case 5: Easysort(L); break;
   case 6: HeapSort(L);
     for(i=1;i<=L.length;i++)
      printf("%d ",L.r[i].key);
     printf("/n");
     break;
   case 0: exit(0);break;
   default : printf("/nInput error!"); break;
   }
  
}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值