2019数据结构课程设计(终于可以回家了)

课程设计的组成部分
随机生成n个整型数据,比较冒泡排序、直接插入排序、希尔排序、快速排序、简单选择排序、堆排序和归并排序的时间性能。
要求:
1.n=5000,20000,80000,100000;
2.绘制时间性能的比较图;
3.撰写课程设计报告;
提交课程设计报告的电子版。

1.冒泡排序

#include "stdio.h"
#include "time.h"
#define N 100000

void BubbleSort(int a[],int n)
{
	int i,j,t;
	for(i=0;i<n-1;i++)
		for(j=n-1;j>i;j--)
			if(a[j]<a[j-1])
			{
				t=a[j];
				a[j]=a[j-1];
				a[j-1]=t;
			}
}
main()

{
	int data[N],a[N],b[N],i;
	clock_t start,end;
	srand((unsigned)time(0));//设置随机生成函数的种子
	printf("排序前:\n");
	for(i=0;i<N;i++)
	{
		data[i]=rand()%(N*10)+1;//生成1-100之间的随机数
		a[i]=data[i];
		printf("%d ",a[i]);
	}
	printf("\n排序后:\n");
	start=clock();
	BubbleSort(a,N);
	end=clock();
	for(i=0;i<N;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("冒泡排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
	

}

2.插入排序

#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 10

void InSertSort(int a[],int n)
{
	int i,j,t; 
	for(i=1;i<n;i++)
	{
		if(a[i]<a[i-1])
		{
			t=a[i];
			j=i-1;
			do
			{
				a[j+1]=a[j];
				j--;
			}while(j>=0&&a[j]>t);
			a[j+1]=t;
		}
	}
}



main()

{
	int data[N],a[N],b[N],i;
	clock_t start,end;
	srand((unsigned)time(0));//设置随机生成函数的种子
	printf("排序前:\n");
	for(i=0;i<N;i++)
	{
		data[i]=rand()%(N*10)+1;//生成1-100之间的随机数
		a[i]=data[i];
		printf("%d ",a[i]);
	}
	printf("\n排序后:\n");
	start=clock();
	InSertSort(a,N);
	end=clock();
	for(i=0;i<N;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("插入排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
	

}


3.堆排序

#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 10

void sift(int a[],int low,int high)
{
	int i=low,j=2*i;
	int tmp=a[i];
	while(j<=high)
	{
		if(j<high&&a[j]<a[j+1])
		j++;
		if(tmp<a[j])
		{
			a[i]=a[j];
			i=j;
			j=2*i;
		}
		else break;
	}
	a[i]=tmp;
}


void swap(int *pa,int *pb)
{
	int tmp;
	tmp=*pa,*pa=*pb,*pb=tmp;
}

void HeapSort(int a[],int n)
{
	int i;
	for(i=n/2;i>=0;i--)
		sift(a,i,n);
		for(i=n;i>=1;i--)
		{
			swap(&a[0],&a[i]);
			sift(a,0,i-1);
		}
}


main()

{
	int data[N],a[N],b[N],i;
	clock_t start,end;
	srand((unsigned)time(0));//设置随机生成函数的种子
	printf("排序前:\n");
	for(i=0;i<N;i++)
	{
		data[i]=rand()%(N*10)+1;//生成1-100之间的随机数
		a[i]=data[i];
		printf("%d ",a[i]);
	}
	printf("\n排序后:\n");
	start=clock();
	HeapSort(a,N);
	end=clock();
	for(i=0;i<N;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("堆排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
	

}

4.归并排序

#include<stdio.h>
#include<time.h>
#define N 100000
#define max 1000
void merge(int a[],int p,int x,int q,int b[]){
    int i = p, r = x + 1, k=p;
    while(i<=x || r <= q){
    
        if((r > q)||(i <= x &&a[i] <= a[r])){
            b[k++] = a[i++];
        }else{
            b[k++] = a[r++];
        }
    }
    int j;
    //将B数组重新放入A数组
    for(j = p;j <=q;j++)
        a[j] = b[j];
}
void mergeSort(int a[],int p,int q,int b[]){
        if(p<q){
        //将数组平均分为两段
        int x=(q + p)/2;
        //递归
        mergeSort(a,p,x,b);
        mergeSort(a,x+1,q,b);
        merge(a,p,x,q,b);
        }
}
int main(){
    srand((unsigned int)time(NULL));
    int i;
    int start,end;
    int a[N],b[N];
    printf("随机产生的N个随机数为:\n");
    for(i = 0; i< N; i++){
        a[i] = rand()%max+1;
        printf("%d ",a[i]);
    }
    start=clock();
    mergeSort(a,0,N,b);
    end=clock();
    for(i = 0; i< N; i++){
        printf("%d ",a[i]);
    }
    printf("\n");
    printf("归并排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
    return 0;
}


5.简单选择排序

#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 100000


void swap(int *pa,int *pb)
{
	int tmp;
	tmp=*pa,*pa=*pb,*pb=tmp;
}

void SelectSort(int a[],int n)
{
	int i,j,k;
	for(i=0;i<n-1;i++)
	{
	k=i;
		for(j=i+1;j<n;j++)
			if(a[j]<a[k])
			{
				k=j;
			}
			if(k!=i)
			{
			   swap(&a[i],&a[k]);
			   
		}
	}
			   
}
main()

{
	int data[N],a[N],b[N],i;
	clock_t start,end;
	srand((unsigned)time(0));//设置随机生成函数的种子
	printf("排序前:\n");
	for(i=0;i<N;i++)
	{
		data[i]=rand()%(N*10)+1;//生成1-100之间的随机数
		a[i]=data[i];
		printf("%d ",a[i]);
	}
	printf("\n排序后:\n");
	start=clock();
	SelectSort(a,N);
	end=clock();
	for(i=0;i<N;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("简单选择排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
	

}

6.快速排序

#include<stdio.h>
#include<time.h>          //产生随机数时时钟做种子
#include<stdlib.h>
#define MaxSize 50
#define N 100000

typedef struct
{
    int key;      //记录关键字
}RecordType;


int QKPass(RecordType r[], int left, int right) //一趟快速排序算法
{
    int low = left;
    int high = right;
    r[0] = r[left];
    while (low < high)
    {
        while (low<high && r[high].key>r[0].key)
        {
            high--;
        }
        if (low < high)
        {
            r[low] = r[high];
            low++;
        }
        while (low < high && r[low].key < r[0].key)
        {
            low++;
        }
        if (low < high)
        {
            r[high] = r[low];
            high--;
        }
    }
    r[low] = r[0];
    return low;               //返回基准记录的位置
}
void QKSort(RecordType r[], int low, int high)      //快速排序
{
    if (low < high)
    {
        int pos = QKPass(r, low, high);         //调用一趟快速排序,以枢轴元素为界划分两个子区间
        QKSort(r, low, pos - 1);             //对左部子表进行快速排序
        QKSort(r, pos + 1, high);             //对右部子表进行快速排序
    }
}



void ShowResult(RecordType* r, int length)        //输出结果
{

    for (int i = 1; i <= length; i++)
    {
        printf("%d\t", r[i]);

        if (i % 10 == 0)
        {
            printf("\n");
        }
    }
}

void RandNum(RecordType r[MaxSize])
{
    srand((unsigned)time(NULL)); //初始化随机数
    for (int i = 1; i <= N; i++)      
    {
        r[i].key = rand() % 1000 + 1;       //产生1-100之间的随机数
        printf("%d\t", r[i]);
        if (i % 10 == 0)                    //每行输出10个数
        {
            printf("\n");
        }

    }
}


int main()
{
    int n, m,start,end;
    RecordType r[31] ;
    
    printf("产生的随机待排序列为:\n");
            RandNum(r);
            start=clock();
            QKSort(r, 1, 100);
            printf("排序结果为:\n");
            ShowResult(r, 100);
}

7.希尔排序

#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 100000

void ShellSort(int a[],int n)
{
	int i,j,d;
	int t;
	d=n/2;
	while(d>0)
	{
		for(i=d;i<n;i++)
		{
		t=a[i];
		j=i-d;
		while(j>=0&&t<a[j])	
		{
			a[j+d]=a[j];
			j=j-d;
		}
		a[j+d]=t;
		}
		d=d/2;
	}
 } 


main()

{
	int data[N],a[N],b[N],i;
	clock_t start,end;
	srand((unsigned)time(0));//设置随机生成函数的种子
	printf("排序前:\n");
	for(i=0;i<N;i++)
	{
		data[i]=rand()%(N*10)+1;//生成1-100之间的随机数
		a[i]=data[i];
		printf("%d ",a[i]);
	}
	printf("\n排序后:\n");
	start=clock();
	ShellSort(a,N);
	end=clock();
	for(i=0;i<N;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("希尔排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
	

}


排序性能比较如图

在这里插入图片描述

如图,相比较之下,快速排序相对其他算法,所用的时间短。

猜你喜欢

转载自blog.csdn.net/qq_43513350/article/details/94437251