# 头文件1-head.h
#include<stdlib.h>
#include <stdio.h>
#include<time.h>
#define NUM 2000//数组最大值
struct timespec start,end;
double resultTime;
# 头文件2-paixufuction.h
#include"head.h"
//创建随机数存入num.txt文件----------------(1-10000)
void getnum(int *array){
int i,j;
FILE *fp;
srand(time(NULL));
for(i=0;i<NUM;i++){
array[i]=rand()%10000+1;
}
//w->创建,读取
if((fp=fopen("./num.txt","w")) == NULL ) {
printf("Fail to open file!");
exit(0);
}else{
for(i=0;i<NUM;i++)
{
fprintf(fp,"%d\n",array[i]);
}
}
fclose(fp);
printf("✔✔✔随机数写入nun.txt成功!!!\n\n"); //写文件
}
//交换数组值操作
void changedata(int arr[],int i,int j){
int k;
k=arr[j];
arr[j]=arr[i];
arr[i]=k;
}
//起泡排序
void qipao(){
int data[NUM];
int i,j;
int k;//替换变量
FILE *F,*A;
if((F=fopen("./num.txt","rt")) == NULL ) {
printf("文件不存在,请先使用功能1-产随机数在num.txt\n");
exit(0);
}else{
//将取出元素存入数组
for(i=0;i<NUM;i++)
{
fscanf(F,"%d",&data[i]);
}
clock_gettime(CLOCK_MONOTONIC,&start);
for(i=0;i<NUM-1;i++){
for(j=0;j<NUM-1-i;j++){
if(data[j]>data[j+1]){
changedata(data,j,j+1);
}
}
}
clock_gettime(CLOCK_MONOTONIC,&end);
resultTime=(end.tv_sec-start.tv_sec)+(end.tv_nsec-start.tv_nsec)/1e9;
//w->创建,读取
if((A=fopen("./qipao.txt","w")) == NULL ) {
printf("Fail to open file!");
exit(0);
}else{
for(i=0;i<NUM;i++)
{
fprintf(A,"%d\n",data[i]);
}
}
fclose(A);
printf("\n✔✔✔起泡排序完成,结果已保存在qipao.txt文件\n本次排序花费:%f秒",resultTime);
}
}
//选择排序
void xuanze(){
int data[NUM];
FILE *F,*A;
int i,j,mindata;
if((F=fopen("./num.txt","rt")) == NULL ) {
printf("文件不存在,请先使用功能1-产随机数在num.txt\n");
exit(0);
}else{
//将取出元素存入数组
for(i=0;i<NUM;i++)
{
fscanf(F,"%d",&data[i]);
}
clock_gettime(CLOCK_MONOTONIC,&start);
//选择排序代码部分
for(i=0;i<NUM-1;i++){
mindata = i;
for(j=i+1;j<NUM;j++){
if(data[j]<data[mindata])
mindata=j;
}
if(mindata!=i){
changedata(data,mindata,i);
}
}
clock_gettime(CLOCK_MONOTONIC,&end);
resultTime=(end.tv_sec-start.tv_sec)+(end.tv_nsec-start.tv_nsec)/1e9;
//w->创建,读取
if((A=fopen("./xuanze.txt","w")) == NULL ) {
printf("Fail to open file!");
exit(0);
}else{
for(i=0;i<NUM;i++)
{
fprintf(A,"%d\n",data[i]);
}
}
fclose(A);
printf("\n✔✔✔选择排序完成,结果已保存在xuanze.txt文件\n本次排序花费:%f秒",resultTime);
}
}
//堆排序
//保证父节点大于每一个孩子节点
void heapify(int *tree,int n,int i){
if(i>=n){
return;
}
int c1=2*i+1;
int c2=2*i+2;
int max=i;
if(c1<n&&tree[c1]>tree[max]){
max=c1;
}
if(c2<n&&tree[c2]>tree[max]){
max=c2;
}
if(max!=i){
changedata(tree,max,i);
heapify(tree,n,max);
}
}
//从最后父节点开始调整为大顶堆
void buidheap(int *tree,int n){
int lastnode=n-1;
int parent=(lastnode-1)/2;
int i;
for(i=parent;i>=0;i--){
heapify(tree,n,i);
}
}
//堆排序操作
void heapmain(int *tree,int n){
buidheap(tree,n);
int i;
for(i=n-1;i>=0;i--){
changedata(tree,i,0);
//将父节点和最后节点交换后再次调整
heapify(tree,i,0);
}
}
void heap(){
int data[NUM];
int size;//堆大小
size=NUM;
int i,j,mindata;
FILE *F,*A;
if((F=fopen("./num.txt","rt")) == NULL ) {
printf("文件不存在,请先使用功能1-产随机数在num.txt\n");
exit(0);
}else{
//将取出元素存入数组
for(i=0;i<NUM;i++)
{
fscanf(F,"%d",&data[i]);
}
//获取开机到现在的时间
clock_gettime(CLOCK_MONOTONIC,&start);
heapmain(data, NUM);
//获取完成程序的时间
clock_gettime(CLOCK_MONOTONIC,&end);
resultTime=(end.tv_sec-start.tv_sec)+(end.tv_nsec-start.tv_nsec)/1e9;
printf("\n✔✔✔堆排序完成,结果已保存在heap.txt文件\n本次排序花费:%f秒", resultTime);
//w->创建,读取
if((A=fopen("./heap.txt","w")) == NULL ) {
printf("Fail to open file!");
exit(0);
}else{
for(i=0;i<NUM;i++)
{
fprintf(A,"%d\n",data[i]);
}
}
fclose(A);
}
}
#主函数-main.c
#include"paixufuction.h"
int main()
{
printf("✿ ✿ ✿数据结构课程设计-综合排序✿ ✿ ✿\n");
int choice;
int array[NUM];
while(1){
printf("▓▓▓▓▓▓▓▓---功能大全如下,请选择---▓▓▓▓▓▓▓▓\n");
printf("输入数字1:生成随机数在文件num.txt中\n");
printf("输入数字2:起泡排序\n");
printf("输入数字3:选择排序\n");
printf("输入数字4:堆排序\n");
printf("输入数字5:退出本程序\n");
scanf("%d",&choice);
switch(choice){
case 1:
getnum(array);
break;
case 2:
qipao();
break;
case 3:
xuanze();
break;
case 4:
heap();
break;
case 5:
printf("退出程序\n");
return 0;
default:
printf("!!!输入错误,请重新输入数字运行\n");
}
}
}
0 评论