复杂排序五种方法(C版)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
quickSort(data,total);
printf("快速排序的结果:\n");
display();
}
int quickSort(int * Data,int n)
{
return 0;
}
void heap()//堆排序函数
{
for(int k=0;k<total;k++)
heapData[k+1]=data[k];
heapAdjust(i,total);
for(i=total;i>1;--i)
{
temp=heapData[1]; //将堆顶记录和当前未经排序子序列heapData[1..i]
heapData[1]=heapData[i]; //中的最后一个记录相互交换
heapData[i]=temp;
heapAdjust(1,i-1); //将heapData[1..i-1]重新调整为大根堆
}
}
void heapAdjust(int begin,int end)
{
int i,value;
value=heapData[begin];
for(i=2*begin;i<=end;i*=2) //沿关键字较大的结点向下筛选
{
if(i<end&&heapData[i]<heapData[i+1])
++i; //i为关键字较大的记录的下标
if(value>=heapData[i])
break; //value应插入在位置begin上
heapData[begin]=heapData[i];
begin=i;
}
heapData[begin]=value; //插入
for(i=1;i<=total;i++)
return binaryFind(data,(from+to)/2+1,to,find);//返回值待查数据合适的位置
}
void showmenu(void)//菜单界面函数
{
printf("=============================================\n");
printf("高级排序算法功能展示系统\n");
flag=1;
break;
default:
printf("您输入有误!请重新输入:\n");
break;
}
if(flag==1)
{
printf("待排数据如下...\n");
copy();
display();
printf("待排数据成功建立!\n");
}
}
else
{
printf("你已经成功取消了上述操作!\n");
printf("比较简单,先确定一个步长,然后对于所有在某段里\n");
printf("的所有数据进行插入排序,之后把步长缩小,通常可\n");
printf("以除以2,然后重复这个思路,直到最后的步长为1。\n");
copy();
printf("请输入步长:");;
scanf("%d",&step);
printf(" ------------------------------------ \n");
printf(" 1:输入待排数据(建议100个以内)\n");
printf(" 2:显示待排数据\n");
printf(" 3:折半插入排序\n");
printf(" 4:希尔排序\n");
printf(" 5:快速排序\n");
scanf("%d",&dataTem[i]);
flag=1;
break;
case 2:
printf("请输入您需要系统产生待排数据的个数:");
scanf("%d",&total);
printf("系统自动产生%d个数据!\n",total);
for(i=0;i<total;i++)
dataTem[i]=rand()%MAXSIZE; //系统给出一个0-MAXSIZE之间的随机数
printf("这个思路后面的数据移动就必须改为整体移动的过程。\n");
copy();
halfInsert();
printf("排序成功!\n");
}
break;
case 4:
if(flag==1)
{
printf("简介:\n");
printf("希尔排序,又称为“缩小增量排序”,它的思路\n");
while(step<1||step>totalNumbers())
{
printf("输入步长不合适,请输入步长:");
scanf("%d",&step);
return ;
}
printf("待排数据是:\n");
display();
for(int i =0; i<total; i++)
{
int position = binaryFind(data,0,i-1,data[i]);//待查数据合适的位置
int temp =data[i];
for(int j = i-1; j>=position;j--)
int i,temp;
printf("开始对应的二叉树:\n");
for(i=1;i<=total;i++)
printf("%6d",heapData[i]);
printf("\n每次排列后的结果是:\n");
for(i=total/2;i>0;--i) //把heapData[1..i]建成大根堆,从后面开始
processmenu();//菜单选项函数
}
void copy()//复制对象数据函数
{
int i;
for(i=0;i<total;i++)
data[i]=dataTem[i];
}
int totalNumbers()//返回数Baidu Nhomakorabea总数
{
return total;
}
void create()//创建对象数据函数
void copy();//复制对象数据函数
void display();//显示数据函数
int binaryFind(int *data, int from, int to, int find);//折半查找
void halfInsert(); //折半插入排序函数
int totalNumbers(); //希尔排序时通过数据总数确定步长取值范围
{
int choice,i;
char ch;
if(flag==1)//代表此时已经有一组建立好的数据
{
printf("此时系统已经有一组建立好的数据,您确认想替换吗?(Y||y):");
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
flag=0;
}
if(flag==0)
{
printf("创建待排数据:<1>键盘输入<2>自动生成\n请选择:");
截图直接运行debug中的.exe文件
//功能:复杂排序方法的功能演示
#include<stdio.h>
#include<windows.h>
#define MAXNUM 100//数据个数最大值
#define MAXSIZE 1000//数据本身最大值
void create();//创建对象数据函数
int data[MAXNUM];//静态数组作为线性表的存储结构
int dataTem[MAXNUM];//存放初始数据
int total;//数据量
///排序函数开始/////////
void halfInsert()//折半插入排序函数
{
if(total == 0)
{
printf("暂时没有数据!操作失败!\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("请输入您需要键盘输入待排数据的个数:");
scanf("%d",&total);
printf("请开始输入数据(提示:一共%d个数据,用空格分开):\n",total);
for(i=0;i<total;i++)
{
int choice,step;
while(1)
{
system("cls");
showmenu();
scanf("%d",&choice);
switch(choice)
{
case 1:
create();//创造源对象数据
break;
case 2:
if(flag==1)
{
copy();//复制对象
printf("待排数据为:\n");
printf("%5d",data[i]);
}
int mergSsort(int Data[],int n)
{
return 0;
}
//排序函数结束//////
//=======主函数=========
void main(void)
{
system("color f0"); //第一个为背景白色(f),第二个为字体颜色黑色(0)
data[j+1] = data[j];//从后一位向前一位逐次移动数据
if(j != i-1)
data[position] = temp;//将待查数据放入合适的位置
printf("第%d个数据%d找到位置是%d,结果是:\n",i+1,temp,position+1);
display();
}
printf("排序任务完成!\n");
void merge();//归并排序函数主要入口
int mergSsort(int Data[],int n); //归并排序函数具体实现
void processmenu(void); //菜单选项函数
int flag=0;//用来标识待排数据是否产生
int heapData[MAXNUM];//静态数组作为大根堆的存储结构
printf("%5d",heapData[i]);
printf("\n");
}
void merge()//归并排序函数
{
printf("归并排序的过程显示:\n");
mergSsort(data,total);
printf("归并排序的结果:\n");
for(int i=0;i<total;i++)
{
data[w+step]=data[w];
w=w-step;
}
data[w+step]=temp;
}
printf("当输出的步长为%d时,此时的排序结果:\n",step);
display();
step=step/2;
}
}
void quick()//快速排序函数
{
printf("快速排序的主要过程显示:\n");
return from; //待查数据合适的位置
if(find == data[(from+to)/2])
return (from+to)/2;//待查数据合适的位置
else if(find < data[(from+to)/2])//所查找数据小于中间数据时,通过递归继续查找正确的位置
return binaryFind(data,from,(from+to)/2-1,find);
display();
}
break;
case 3:
if(flag==1)
{
printf("简介:\n");;
printf("折半插入排序,是插入排序的改进,它的思路\n");
printf("是把找到正确位置的过程从逐一比较改为二分查找比较,\n");
printf("这样在查找正确位置时就可以大大提升时间效率。\n");
void shell(int step); //希尔排序函数
void quick(); //快速排序函数主要入口
int quickSort(int * Data,int n); //快速排序函数递归实现
void heap(); //堆排序函数主要入口
void heapAdjust(int begin,int end); //堆排序函数重组堆
}
}
void display()//显示函数
{
int i;
for(i=0;i<total;i++)
printf("%5d",data[i]);
printf("\n");
}
int binaryFind(int *data, int from, int to, int find)//折半查找
{
if(from > to)
}
void shell(int step)//希尔排序函数
{
int temp;
int i,j,w;
while(step>0)
{
for(int j=step;j<total;j++)
{
temp=data[j];
w=j-step;
while((temp<data[w])&&(w>=0)&&(w<=total))
printf(" 6:堆排序\n");
printf(" 7:归并排序\n");
printf(" 0:退出本系统\n");
printf("============================================ \n");
printf("请选择:");
}
void processmenu(void)//菜单选项函数
printf("快速排序的结果:\n");
display();
}
int quickSort(int * Data,int n)
{
return 0;
}
void heap()//堆排序函数
{
for(int k=0;k<total;k++)
heapData[k+1]=data[k];
heapAdjust(i,total);
for(i=total;i>1;--i)
{
temp=heapData[1]; //将堆顶记录和当前未经排序子序列heapData[1..i]
heapData[1]=heapData[i]; //中的最后一个记录相互交换
heapData[i]=temp;
heapAdjust(1,i-1); //将heapData[1..i-1]重新调整为大根堆
}
}
void heapAdjust(int begin,int end)
{
int i,value;
value=heapData[begin];
for(i=2*begin;i<=end;i*=2) //沿关键字较大的结点向下筛选
{
if(i<end&&heapData[i]<heapData[i+1])
++i; //i为关键字较大的记录的下标
if(value>=heapData[i])
break; //value应插入在位置begin上
heapData[begin]=heapData[i];
begin=i;
}
heapData[begin]=value; //插入
for(i=1;i<=total;i++)
return binaryFind(data,(from+to)/2+1,to,find);//返回值待查数据合适的位置
}
void showmenu(void)//菜单界面函数
{
printf("=============================================\n");
printf("高级排序算法功能展示系统\n");
flag=1;
break;
default:
printf("您输入有误!请重新输入:\n");
break;
}
if(flag==1)
{
printf("待排数据如下...\n");
copy();
display();
printf("待排数据成功建立!\n");
}
}
else
{
printf("你已经成功取消了上述操作!\n");
printf("比较简单,先确定一个步长,然后对于所有在某段里\n");
printf("的所有数据进行插入排序,之后把步长缩小,通常可\n");
printf("以除以2,然后重复这个思路,直到最后的步长为1。\n");
copy();
printf("请输入步长:");;
scanf("%d",&step);
printf(" ------------------------------------ \n");
printf(" 1:输入待排数据(建议100个以内)\n");
printf(" 2:显示待排数据\n");
printf(" 3:折半插入排序\n");
printf(" 4:希尔排序\n");
printf(" 5:快速排序\n");
scanf("%d",&dataTem[i]);
flag=1;
break;
case 2:
printf("请输入您需要系统产生待排数据的个数:");
scanf("%d",&total);
printf("系统自动产生%d个数据!\n",total);
for(i=0;i<total;i++)
dataTem[i]=rand()%MAXSIZE; //系统给出一个0-MAXSIZE之间的随机数
printf("这个思路后面的数据移动就必须改为整体移动的过程。\n");
copy();
halfInsert();
printf("排序成功!\n");
}
break;
case 4:
if(flag==1)
{
printf("简介:\n");
printf("希尔排序,又称为“缩小增量排序”,它的思路\n");
while(step<1||step>totalNumbers())
{
printf("输入步长不合适,请输入步长:");
scanf("%d",&step);
return ;
}
printf("待排数据是:\n");
display();
for(int i =0; i<total; i++)
{
int position = binaryFind(data,0,i-1,data[i]);//待查数据合适的位置
int temp =data[i];
for(int j = i-1; j>=position;j--)
int i,temp;
printf("开始对应的二叉树:\n");
for(i=1;i<=total;i++)
printf("%6d",heapData[i]);
printf("\n每次排列后的结果是:\n");
for(i=total/2;i>0;--i) //把heapData[1..i]建成大根堆,从后面开始
processmenu();//菜单选项函数
}
void copy()//复制对象数据函数
{
int i;
for(i=0;i<total;i++)
data[i]=dataTem[i];
}
int totalNumbers()//返回数Baidu Nhomakorabea总数
{
return total;
}
void create()//创建对象数据函数
void copy();//复制对象数据函数
void display();//显示数据函数
int binaryFind(int *data, int from, int to, int find);//折半查找
void halfInsert(); //折半插入排序函数
int totalNumbers(); //希尔排序时通过数据总数确定步长取值范围
{
int choice,i;
char ch;
if(flag==1)//代表此时已经有一组建立好的数据
{
printf("此时系统已经有一组建立好的数据,您确认想替换吗?(Y||y):");
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
flag=0;
}
if(flag==0)
{
printf("创建待排数据:<1>键盘输入<2>自动生成\n请选择:");
截图直接运行debug中的.exe文件
//功能:复杂排序方法的功能演示
#include<stdio.h>
#include<windows.h>
#define MAXNUM 100//数据个数最大值
#define MAXSIZE 1000//数据本身最大值
void create();//创建对象数据函数
int data[MAXNUM];//静态数组作为线性表的存储结构
int dataTem[MAXNUM];//存放初始数据
int total;//数据量
///排序函数开始/////////
void halfInsert()//折半插入排序函数
{
if(total == 0)
{
printf("暂时没有数据!操作失败!\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("请输入您需要键盘输入待排数据的个数:");
scanf("%d",&total);
printf("请开始输入数据(提示:一共%d个数据,用空格分开):\n",total);
for(i=0;i<total;i++)
{
int choice,step;
while(1)
{
system("cls");
showmenu();
scanf("%d",&choice);
switch(choice)
{
case 1:
create();//创造源对象数据
break;
case 2:
if(flag==1)
{
copy();//复制对象
printf("待排数据为:\n");
printf("%5d",data[i]);
}
int mergSsort(int Data[],int n)
{
return 0;
}
//排序函数结束//////
//=======主函数=========
void main(void)
{
system("color f0"); //第一个为背景白色(f),第二个为字体颜色黑色(0)
data[j+1] = data[j];//从后一位向前一位逐次移动数据
if(j != i-1)
data[position] = temp;//将待查数据放入合适的位置
printf("第%d个数据%d找到位置是%d,结果是:\n",i+1,temp,position+1);
display();
}
printf("排序任务完成!\n");
void merge();//归并排序函数主要入口
int mergSsort(int Data[],int n); //归并排序函数具体实现
void processmenu(void); //菜单选项函数
int flag=0;//用来标识待排数据是否产生
int heapData[MAXNUM];//静态数组作为大根堆的存储结构
printf("%5d",heapData[i]);
printf("\n");
}
void merge()//归并排序函数
{
printf("归并排序的过程显示:\n");
mergSsort(data,total);
printf("归并排序的结果:\n");
for(int i=0;i<total;i++)
{
data[w+step]=data[w];
w=w-step;
}
data[w+step]=temp;
}
printf("当输出的步长为%d时,此时的排序结果:\n",step);
display();
step=step/2;
}
}
void quick()//快速排序函数
{
printf("快速排序的主要过程显示:\n");
return from; //待查数据合适的位置
if(find == data[(from+to)/2])
return (from+to)/2;//待查数据合适的位置
else if(find < data[(from+to)/2])//所查找数据小于中间数据时,通过递归继续查找正确的位置
return binaryFind(data,from,(from+to)/2-1,find);
display();
}
break;
case 3:
if(flag==1)
{
printf("简介:\n");;
printf("折半插入排序,是插入排序的改进,它的思路\n");
printf("是把找到正确位置的过程从逐一比较改为二分查找比较,\n");
printf("这样在查找正确位置时就可以大大提升时间效率。\n");
void shell(int step); //希尔排序函数
void quick(); //快速排序函数主要入口
int quickSort(int * Data,int n); //快速排序函数递归实现
void heap(); //堆排序函数主要入口
void heapAdjust(int begin,int end); //堆排序函数重组堆
}
}
void display()//显示函数
{
int i;
for(i=0;i<total;i++)
printf("%5d",data[i]);
printf("\n");
}
int binaryFind(int *data, int from, int to, int find)//折半查找
{
if(from > to)
}
void shell(int step)//希尔排序函数
{
int temp;
int i,j,w;
while(step>0)
{
for(int j=step;j<total;j++)
{
temp=data[j];
w=j-step;
while((temp<data[w])&&(w>=0)&&(w<=total))
printf(" 6:堆排序\n");
printf(" 7:归并排序\n");
printf(" 0:退出本系统\n");
printf("============================================ \n");
printf("请选择:");
}
void processmenu(void)//菜单选项函数