内部排序算法的性能分析
一 需求分析
1) 对起泡排序、直接排序、简单选择排序、快速排序、希尔排序、堆排序算法进行比较;
2) 排序表中数据数目不小于100 ,表中数据随机产生,至少用5组不同数据集作比较,比较指标有:关键字参加比较次数和关键字的移动次数(关键字交换记为3次移动);
3) 输出比较结果。
二 系统设计
对于排序算法的比较采取关键字参加比较次数和关键字的移动次数还有利用time.h中(int)GetTickCount()函数对cpu运用该排序算法所采用时间进行比较。
在表中数据随机产生部分,设置了一个void RandomNum()函数,运用
srand(2000);产生了2000个随机数。
在程序的执行方面
首先定义了一个界面显示函数void SelectSort()
void SelectSort(){
printf(" ----------------------------\n");
printf(" * 1. 插入排序 *\n");
printf(" * 2. 希尔排序 * \n");
printf(" * 3. 快速排序 * \n");
printf(" * 4. 堆排序 * \n");
printf(" * 5. 冒泡排序 *\n");
printf(" * 6. 选择排序 *\n");
printf(" * 7. 以上所有排序方式 * \n");
printf(" * 0. 退出程序 *\n");
printf(" ----------------------------\n\n ");
printf("Please Select the Operate:");
}
对操作界面进行了一定的优化
使用户可以很方便的进行一定的交互。
然后针对各种排序算法,写出函数,对算法进行实现。
例如void ShellInsert()//希尔排序 int Partition()//快速排序
void HeapAdjust ()//堆排序 void BubbleSort()//冒泡排序
int SelectMinKey()//选择排序
增添了一个对所有算法进行一次实现的函数void AllAbove()
程序模块调用图
三 代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //memset() memcpy() 头文件
#include <conio.h>
#include <time.h> //计时器 clock-t 记录函数初始时间 结束时间 来记录算法在cpu内部运行时间
#include <windows.h>
#include <winbase.h>
#define MAXSIZE 5000 //顺序表的最大长度
#define TRUE 1
#define FALSE 0
typedef int BOOL;
typedef struct{
int key; //记录关键字项
} RedType; //记录类型
typedef struct LinkList{
RedType r[MAXSIZE+1];
int Length; //顺序表长度
} LinkList;
int RandArray[MAXSIZE+1]; //全局变量数组 便于内部操作
void RandomNum(){
int i;
srand(2000); //标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数:
//void srand(unsigned seed);参数seed是rand()的种子,用来初始化rand()的起始值。
for (i = 1; i <= MAXSIZE; i++)
RandArray[i] = (int)rand(); //构造随机序列
//函数一:int rand(void);从srand (seed)中指定的