实验七 排序算法的实现

一、【实验目的】

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种排序算法(含两种先进排序算法),在无序状态下进行多次运行,记录运行时间,并比较测试结果。

提示:在程序的实现过程中要用到以下函数,请大家在实验之前自学这几个函数的用法:

1)随机函数rand()

2)时间函数clock()

3)随机数种子函数srand( )

三、【实验源代码】

 #include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define RANDNUM 15000  //随机数的个数
void QuickSort(int *arr, int low, int high)
{
	  int i = low;
        int j = high;
        int k = arr[low];
        if(low>high)
        return;
        while (i < j)
        {
            while(i < j && arr[j] >= k)     // 从右向左找第一个小于k的数
                j--;
            if(i < j)
                arr[i++] = arr[j];
            while(i < j && arr[i] < k)      // 从左向右找第一个大于等于k的数
                i++;
            if(i < j)
                arr[j--] = arr[i];
        }
 
        arr[i] = k;
 
        // 递归调用
        QuickSort(arr, low, i - 1);     // 排序k左边
        QuickSort(arr, i + 1, high);    // 排序k右边
}
void shellSort(int *a, int len)
{
    int i, j, k, tmp, gap;  // gap 为步长
    for (gap = len / 2; gap > 0; gap /= 2) 
	{  // 步长初始化为数组长度的一半,每次遍历后步长减半,
    	for (i = 0; i < gap; ++i) 
		{ // 变量 i 为每次分组的第一个元素下标 
	        for (j = i + gap; j < len; j += gap) 
			{ //对步长为gap的元素进行直插排序,当gap为1时,就是直插排序
	            tmp = a[j];  // 备份a[j]的值
	            k = j - gap;  // j初始化为i的前一个元素(与i相差gap长度)
	            while (k >= 0 && a[k] > tmp) 
				{
	                a[k + gap] = a[k]; // 将在a[i]前且比tmp的值大的元素向后移动一位
	                k -= gap;
	            }
	            a[k + gap] = tmp; 
	        }
	    }
    }
}
void main()

{ 

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

       clock_t first,second; //记录开始和结束时间(以毫秒为单位)
       double t;
       int temp,a[RANDNUM],b[RANDNUM];
       int i,j,index;

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

       {//产生1万个随机数

          iRandNum[i]=rand()%10000;

       }
       for(i=0;i<RANDNUM;i++)
       {
       	a[RANDNUM]=iRandNum[RANDNUM];
       	b[RANDNUM]=iRandNum[RANDNUM];
	   }
	   printf("初始序列前20个数为:\n");
       for(i=0;i<20;i++)
       {
       	printf("%d  ",iRandNum[i]);
       	if(i%5==0&&i>0)
       	printf("\n");
       }
       printf("\n");
       first=clock(); //开始时间
       //此处加入排序程序
       
	    i=0;
	    while(i<5)
	    {	
        QuickSort(iRandNum, 0, RANDNUM-1);//快速排序 
        i++;
        }
      
       second=clock();//结束时间
            //显示排序算法所用的时间
        t=(double)(second-first)/CLK_TCK;
        printf("快速排序%lf seconds",t);
        printf("\n");
        
       first=clock(); 
       
       i=0;
       while(i<15){
       shellSort(a, RANDNUM);
       i++;
       }
       
       second=clock();
       t=(double)(second-first)/CLK_TCK;
       printf("希尔排序 %lf seconds",t);
        
        printf("\n");
        first=clock();
        for(i=0;i<RANDNUM-1;i++)
        {
        	index=i;
        	for(j=i+1;j<RANDNUM;j++)
        	{
        		if(b[j]<b[index])
        		index=j;
			}
			temp=b[index];
			b[index]=b[i];
			b[i]=temp;
		}
      
        second=clock();
        t=(double)(second-first)/CLK_TCK;
        printf("选择排序 %lf seconds",t);
        
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳舞的muse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值