数据结构实验七 排序算法的实现

一、【实验目的】

1、掌握插入排序算法和交换排序算法

2、掌握各种排序算法的优劣

二、【实验内容】

(1)以下是一个通过随机数来测试排序算法运行时间的程序,中间留出了加入排序算法的部分。其中可以通过修改RANDNUM的值来更改测试的数据量:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define RANDNUM 10000 //随机数的个数

void main()

       int iRandNum[RANDNUM];//存放随机数

       clock_t first,second; //记录开始和结束时间(以毫秒为单位)

       int i;

          for(i=0;i<RANDNUM;i++)

       {//产生1万个随机数

          iRandNum[i]=rand()%RANDNUM;

       }

       first=clock(); //开始时间

       //此处加入排序程序

       second=clock();//结束时间

            //显示排序算法所用的时间

}

(2) 从选择、交换、插入排序算法中任选至少3种排序算法(含两种先进排序算法),在无序状态下进行多次运行,记录运行时间,并比较测试结果。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<malloc.h> 
#define RANDNUM 10000 //随机数的个数

typedef struct{
	int key;
}element;

void merge(element a[],element swap[],int k,int n)//归并 
{
	int i,j,l1,u1,l2,u2,m;
	l1=0;
	m=0;
	while(l1+k<=n-1)
	{
		l2=l1+k;
		u1=l2-1;
		u2=(l2+k-1<=n-1)?l2+k-1:n-1;
		for(i=l1,j=l2;i<=u1&&j<=u2;m++)
		{
			if(a[i].key<a[j].key)
			{
				swap[m]=a[i];
				i++;
			}
			else
			{
				swap[m]=a[j];
				j++;
			}
		}
		while(i<u1)
		{
			swap[m]=a[i];
			m++;
			i++;
		}
		while(j<=u2)
		{
			swap[m]=a[j];
			m++;
			j++;
		}
		l1=u2+1;
	}
	for(i=l1;i<n;i++,m++)
	swap[m]=a[i];
}
void mergesort(element a[],int n)
{
	int i,k =1;
	element *swap;
	swap=(element*)malloc(sizeof(element)*n);
	while(k<n)
	{
		merge(a,swap,k,n);
		for(i=0;i<n;i++)
		a[i]=swap[i];
		k=k*2;
	}
	free(swap);
}

void shellsort(int* arr, int n)//希尔 
{
	int gap = n;
	while (gap>1)
	{
		//每次对gap折半操作
		gap = gap / 2;
		//单趟排序
		int i;
		for (i = 0; i < n - gap; ++i)
		{
			int end = i;
			int tem = arr[end + gap];
			while (end >= 0)
			{
				if (tem < arr[end])
				{
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = tem;
		}
	}
}

void maopao(element a[],int n)//冒泡排序 
{
	int i,j,tag=1;
	element temp;
	for(i=1;i<n&&tag==1;i++)
	{
		tag=0;
		for(j=0;j<n-1;j++)
		{
			if(a[j].key>a[j+1].key)
			{
				tag=1;
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
}

void kuaisu(element a[],int low,int high)//快速排序 
{
	int i,j;
	element temp;
	i=low;
	j=high;
	temp=a[low];
	while(i<j)
	{
		while(i<j&&temp.key<=a[j].key)
		j--;
		if(i<j)
		{
			a[i]=a[j];
			i++;
		}
		while(i<j&&a[i].key<temp.key) i++;
		if(i<j)
		{
			a[j]=a[i];
			j--;
		}
	}
	a[i]=temp;
	if(low<i) kuaisu(a,low,i-1);
	if(i<high) kuaisu(a,j+1,high);
	
}
int main(void) 

{ 

    element iRandNum[RANDNUM];//存放随机数

    clock_t first,second; //记录开始和结束时间(以毫秒为单位)
    srand(time(0));
  	int i;
	double t=0;
    for(i=0;i<RANDNUM;i++)
    {	
	
	iRandNum[i].key=rand()%RANDNUM;//产生1万个随机数
	  
    }
    for(i=0;i<20;i++)
    {
    	printf("%d ",iRandNum[i]);
    }
    printf("\n");
    first=clock(); //开始时间
  	maopao(iRandNum,10000);
    second=clock();//结束时间	
    t=(double)(second-first) / CLOCKS_PER_SEC;
    printf("mao pao :%f seconds\n",t);
    
    first=clock(); //开始时间
	kuaisu(iRandNum,0,10000);
    second=clock();//结束时间	
    t=(double)(second-first) / CLOCKS_PER_SEC;
    printf("kuaisu  :%f seconds\n",t);
    
   	first=clock(); //开始时间
	mergesort(iRandNum,10000);
    second=clock();//结束时间	
    t=(double)(second-first) / CLOCKS_PER_SEC;
    printf("mergesort :%f seconds\n",t);
    
    
    return 0;

}

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值