//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;
}
}
}