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/n",L.r[i].key);

}

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/n",L.r[i].key);
}

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/n",L.r[i].key);
}


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/n",L.r[i].key); break;;
   case 3: Bubblesort(L); break;
   case 4: QSort(L,1,L.length);   for(i=1;i<=L.length;i++)
   printf("%d/n",L.r[i].key); break;
   case 5: Easysort(L); break;
      case 6: HeapSort(L); for(i=1;i<=L.length;i++)
   printf("%d/n",L.r[i].key); break;
   case 0: exit(0);break;
   default : printf("/nInput error!"); break;
}

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值