数据与结构实验七:排序算法实现与比较

1. 实验目的

(1)掌握几种低效的排序方法;

(2)掌握几种高效的排序方法。

2. 实验内容

第一题:educoder中完成插入排序和快速排序。

第二题:线下实验中进行排序算法的比较

  1. 通过实验记录同一类排序算法的比较次数和移动次数,从而比较算法的时间效率;
  2. 产生特殊的数据初始状态,如正序、逆序、基本有序、数据规模等,从而对算法进行综合比较。

重点:

排序算法的比较

难点:

1、随机生成要排序的数据,使用rand函数的之前记得调用函数srand

2、至少掌握一种排序算法并实现升序排序和降序排序。
3、有能力希望能掌握多种排序算法,并进行比较。

 

具体讲解

1、编写排序算法时,经常会出现程序能运行,但是运行结果有误的情况,这就需要掌握程序的单步调试方法。单步调试的思维C语言复习文件夹中对于每种程序结构都有介绍。而单步调试的快捷键对于不同的编译环境是不同的,比如VC6与codeblock就有所区别。

另外,编写排序算法后,还需要多用不同的数据运行测试几次。

2、介绍随机数生成的方法和注意事项,使用rand函数

3、介绍如何获得程序片段的运行时间

4、对请学生自行学习阅读快速排序算法的优化方法

5、由学生自行选择排序算法编写程序

快速排序代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// data-- 待排序的数组
// l -- 数组的左边界(例如,从起始位置开始排序,则l=0)
// r -- 数组的右边界(例如,排序截止到数组末尾,则r=a.length-1)
 
void Quick_Sort(int a[], int l, int r) {
	if (l < r) {
		int i, j, x;
		i = l;
		j = r;
		x = a[i];
		while(i<j) {
			while (i<j && a[j]>x) {
				j--; // 从右向左找第一个小于x的数
			}
			if (i < j) {
				a[i++] = a[j]; // 将小于x的值放在左边
			}
			while (i < j && a[i] < x) {
				i++; // 从左向右找第一个大于x的数
			}
			if (i < j) {
				a[j--] = a[i]; // 将大于x的值放在右边
			}
		}
		a[i] = x;
		Quick_Sort(a, l, i - 1);
		Quick_Sort(a, i+1, r);
	}
}
 
int main()
{   printf("快速排序算法\n"); 
	int  i, j;
	int data[100000];
	srand((unsigned int)time(0)); 
		for(int b=0;b<100000;b++)        //生成随机数
		    {
		        data[b]=rand() %100000;
		    }
		printf( "排序前前100个数据:" );
		for( i = 1; i <=100; i++ )
			{
				printf(" %5d ", data[i] );
			}
	    printf("\n");
	    clock_t StartTime,EndTime; 
			double time;
			StartTime=clock();    
			Quick_Sort(data, 0, 99999); 
			EndTime=clock();        
			time=(double)(EndTime-StartTime);  
			printf("排序后前100个数据:" );
				for(int k = 1; k <= 100; k++  )
						{
							printf(" %5d ", data[k] );
						}
						printf( "\n" );
			printf("执行时间为:%f毫秒\n",time);
			return 0;

}

希尔排序代码:

#include<stdio.h>
#include <stdlib.h>
#include <time.h>
void ShellSort(int* arr, int size)
{
    int gap = size;
    while (gap > 1)
    {
        gap = gap / 3 + 1;
        int i = 0;
        for (i = 0; i < size - gap; i++)
        {
            int end = i;
            int temp = arr[end + gap];
            while (end >= 0)
            {
                if (arr[end] > temp)
                {
                    arr[end + gap] = arr[end];
                    end -= gap;
                }
                else
                {
                    break;
                }
            }
            arr[end + gap] = temp;
        }
    }
}
int main()
{   printf("希尔排序算法\n"); 
	int  i, j;
	int count=100000;
	int data[100000];
	srand((unsigned int)time(0)); 
	for(int b=0;b<100000;b++)        
	    {
	        data[b]=rand() %100000;
	    }
	printf( "排序前前100个数据:" );
	for( i = 1; i <=100; i++ )
		{
			printf(" %5d ", data[i] );
		}
    printf("\n");
	clock_t StartTime,EndTime; 
	double time;
	StartTime=clock(); 
	ShellSort(data, count); 
	EndTime=clock(); 
	time=(double)(EndTime-StartTime)/CLOCKS_PER_SEC;   
	printf("排序后前100个数据:" );
		for(int k = 1; k <= 100; k++  )
				{
					printf(" %5d ", data[k] );
				}
				printf( "\n" );
	printf("执行时间为:%f毫秒\n",time*1000);
	return 0;
} 

选择排序代码:

#include<stdio.h>
#include <stdlib.h>
#include <time.h>
void BubbleSort( int data[], int n );
int main()
{   printf("选择排序算法\n"); 
	int  i, j;
	int count=100000;
	int data[100000];
	srand((unsigned int)time(0)); 
	for(int b=0;b<100000;b++)        //生成随机数
	    {
	        data[b]=rand()%100000;
	    }
	printf( "排序前前100个数据:" );
	for( i = 1; i <=100; i++ )
		{
			printf(" %5d ", data[i] );
		}
    printf("\n");
	clock_t StartTime,EndTime;
	double time;
	StartTime=clock();        
	BubbleSort(data, count); 
	EndTime=clock();      
	time=(double)(EndTime-StartTime)/CLOCKS_PER_SEC;
	printf("排序后前100个数据:" );
		for(int k = 1; k <= 100; k++  )
				{
					printf(" %5d ", data[k] );
				}
				printf( "\n" );
	printf("执行时间为:%f毫秒\n",time*1000);
	return 0;
} 
/*
功能:使用选择排序法对数组data进行排序
输入参数:
	data[],已知数据散乱的数组
	n,元素的个数
输出参数:
	data[],排好序的数组
返回值:无 
*/
void BubbleSort( int data[], int n )
{
	int i, j, k, t;
	for( i = 1; i <= n-1; i++ )
	{
		for( j = 1; j <= n-i; j++ )
		{
			if( data[j+1] < data[j] )
			{
				t= data[j+1];
				data[j+1] = data[j];
				data[j]   = t;
			}
		}

		
	}
}

三者综合比较:

#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#define _CRT_SECURE_NO_WARNINGS 1
void BubbleSort( int data[], int n )
{
	int i, j, k, t;
	for( i = 1; i <= n-1; i++ )
	{
		for( j = 1; j <= n-i; j++ )
		{
			if( data[j+1] < data[j] )
			{
				t= data[j+1];
				data[j+1] = data[j];
				data[j]   = t;
			}
		}

		
	}
}
void Quick_Sort(int a[], int l, int r) {
	if (l < r) {
		int i, j, x;
		i = l;
		j = r;
		x = a[i];
		while(i<j) {
			while (i<j && a[j]>x) {
				j--; // 从右向左找第一个小于x的数
			}
			if (i < j) {
				a[i++] = a[j]; // 将小于x的值放在左边
			}
			while (i < j && a[i] < x) {
				i++; // 从左向右找第一个大于x的数
			}
			if (i < j) {
				a[j--] = a[i]; // 将大于x的值放在右边
			}
		}
		a[i] = x;
		Quick_Sort(a, l, i - 1);
		Quick_Sort(a, i+1, r);
	}
}
void ShellSort(int* arr, int size)
{
    int gap = size;
    while (gap > 1)
    {
        gap = gap / 3 + 1;	//调整希尔增量
        int i = 0;
        for (i = 0; i < size - gap; i++)	//从0遍历到size-gap-1
        {
            int end = i;
            int temp = arr[end + gap];
            while (end >= 0)
            {
                if (arr[end] > temp)
                {
                    arr[end + gap] = arr[end];
                    end -= gap;
                }
                else
                {
                    break;
                }
            }
            arr[end + gap] = temp;	//以 end+gap 作为插入位置
        }
    }
}
int main()
{   
	int  i, j;
	int count=100000;
	int data1[100000];
	int data2[100000];
	int data3[100000];
	srand((unsigned int)time(0)); 
	for(int b=0;b<100000;b++)        //生成随机数
	    {
	        data1[b]=rand()%100000;
	        data2[b]=rand()%100000;
	        data3[b]=rand()%100000;
	        
	    }
	int time1,time2,time3;
	
	clock_t StartTime1=clock(); 
	BubbleSort(data1,count);
	clock_t EndTime1=clock();
	time1=EndTime1-StartTime1;
	
	clock_t StartTime2=clock(); 
	Quick_Sort(data2,0,99999); 
	clock_t EndTime2=clock();
	time2=EndTime2-StartTime2;
	
	clock_t StartTime3=clock(); 
	ShellSort(data3, count); 
	clock_t EndTime3=clock();  
	time3=EndTime3-StartTime3; 
	
	printf("选择排序执行时间为:%d毫秒\n",time1);
	printf("快速排序执行时间为:%d毫秒\n",time2);
	printf("希尔排序执行时间为:%d毫秒\n",time3);
	return 0;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值