1. 实验目的
(1)掌握几种低效的排序方法;
(2)掌握几种高效的排序方法。
2. 实验内容
第一题:educoder中完成插入排序和快速排序。
第二题:线下实验中进行排序算法的比较
- 通过实验记录同一类排序算法的比较次数和移动次数,从而比较算法的时间效率;
- 产生特殊的数据初始状态,如正序、逆序、基本有序、数据规模等,从而对算法进行综合比较。
重点:
排序算法的比较
难点:
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;
}