做课程设计时,写了一个排序的算法包,可用来分析常用的几种排序算法的交换,比较和移动等的次数。同时生成数据的方式有随机,正序和逆序等功能。这里拿来共享下,有什么错的,请指正!
先写个排序的数组类,以方便求取各种基本操作的次数/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package nc.norman.sorter;
/**
* 自定义数组,下标都是从1开始的。
* 可以记录排序时的交换次序,移动次数和比较次数
* 可以由比较方法去确定排序的顺序
* @author NC
* @version 1.0
*/
public class SortArray {
private int[] array;//数组
public int order;
public int length;//记录数组长度
private int key;//用于暂存比较的关键字
private int exchangeCount = 0;//记录交换次数
private int compareCount = 0;//记录比较次数
private int moveCount = 0;//记录移动次数
private int insertCount = 0;//记录插入次数
public static final int ORDERDATA = 1;
public static final int INVERTEDDATA = 2;
public static final int RANDOMDATA = 3;
public SortArray(int number) {
//默认产生指定长度随机数组
this.array = new int[number];
this.length = number;
this.order = RANDOMDATA;
for (int i = 0; i < number; i++) {
int elem = (int) Math.round(Math.random() * number * 2);
this.array[i] = elem;
}
}
public SortArray(int length, int order) {
//产生指定长度和顺序的数组
this.array = new int[length];
this.length = length;
this.order = order;
if (order == ORDERDATA) {
for (int i = 0; i < length; i++) {
int elem = i + 1;
this.array[i] = elem;
}
} else if (order == INVERTEDDATA) {
for (int i = length - 1,j = 0; i >= 0; i--,j++) {
int elem = i + 1;
this.array[j] = elem;//之前弄错了
}
} else {
for (int i = 0; i < length; i++) {
int elem = (int) Math.round(Math.random() * length * 2);
this.array[i] = elem;
}
}
}
public SortArray copyArray() {
if (this.order != RANDOMDATA) {
return new SortArray(this.length, this.order);
} else {
int[] arr = new int[length];
for (int i = 0; i < arr.length; i++) {
arr[i] = this.array[i];
}
SortArray sa = new SortArray(arr);
return sa;
}
}
public SortArray(int[] array) {
this.length = array.length;
this.array = new int[array.length];
this.order = RANDOMDATA;
for (int i = 0; i < array.length; i++) {
this.array[i] = array[i];
}
}
public int getInsertCount() {
return insertCount;
}
public void addInsertCount() {
this.insertCount++;
}
public int getMoveCount() {
return moveCount;
}
public void addMoveCount() {
this.moveCount++;
}
public int getCompareCount() {
return compareCount;
}
public void addCompareCount() {
this.compareCount++;
}
public int getExchangeCount() {
return exchangeCount;
}
public void addExchangeCount() {
this.exchangeCount++;
}
public int getKey() {
return key;
}
public void setKey(int i) {
this.key = this.array[i - 1];
}
public void setArray(int[] array) {
//要注意,此方法并不会改变其他属性值
for (int i = 0; i < array.length; i++) {
this.array[i] = array[i];
}
}
public int[] getArray() {
return this.array;
}
public int getElement(int i) {
return this.array[i - 1];
}
public void setElement(int i, int value) {
this.array[i - 1] = value;
}
public void print() {
for (int i = 0; i < this.array.length; i++) {
System.out.print(this.array[i] + " ");
}
System.out.println();
}
public void swap(int i, int j) {
int t = this.array[i - 1];
this.array[i - 1] = this.array[j - 1];
this.array[j - 1] = t;
this.exchangeCount++;
}
public boolean compare(int i, int j, boolean order) {
this.compareCount++;
if (order) {//如果是正序
return this.array[i - 1] < this.array[j - 1];
} else {
return this.array[i - 1] > this.array[j - 1];
}
}
public boolean compareNotMoreThan(int a, int b, boolean order) {
this.compareCount++;
if (order) {
return a <= b;
} else {
return a >= b;
}
}
public boolean compareToKey(int i, boolean order) {
this.compareCount++;
if (order) {//如果是正序
return this.array[i - 1] < key;
} else {
return this.array[i - 1] > key;
}
}
public boolean equal(int i, int j) {
return this.array[i - 1] == this.array[j - 1];
}
@Override
public String toString() {
String s = "";
for (int i = 0; i < this.array.length; i++) {
s = s + this.array[i] + " ";
}
return s.trim();
}
}
再写个排序器的抽象类,以方便各种排序算法的实现/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package nc.norman.sorter;
/**
* 排序器
* @author NC
* @version 1.0
*/
public abstract class Sorter {
public final static boolean POSITIVE = true;
public final static boolean INVERTED = false;
public abstract void sort(SortArray array, boolean order);
public final void sort(SortArray array) {
sort(array, POSITIVE);
}
}
具体的实现请看另一排序效率分析2
本来附件是实现的排序效率分析小程序,可生成各种相关的表格
但是,在生成表格时,出了一点小问题,还没改好,暂时不上传了。。。
之前,下过的,不好意思了。。。。。。。
原来这还没有上传啊。。。刚刚才发现,现在重新上传。。。
附件是之前的数据结构的源码和报告
- 大小: 41.1 KB
分享到:
相关推荐
通过C程序的实现,着重阐述了抽象数据类型的概念,并对算法的效率、性能和运行时间进行了分析。 《数据结构与算法分析:C语言描述》特色:着重讨论了算法设计技巧,包括贪婪算法、分治算法、动态规划、随机化算法...
资源名字:基于SSM+mysql的企业台账管理平台设计与实现(源码+设计文档+部署说明+视频演示).zip 资源内容:项目全套源码+完整文档 源码说明: 全部项目源码都是经过测试校正后百分百成功运行。 基于SSM+MySQL的...
本项目主要是学习利用全文检索引擎框架ElasticSearch实现一个中文旅游网站搜索设计,通过建立一个hotel的索引库关联对应的mysql表数据,实现高效率的查询,解决了传统关系型数据因为数据量大导致的查询瓶颈问题。...
个性化推荐:系统基于协同过滤技术,分析用户的历史浏览和购买记录,向用户推荐可能感兴趣的图书。推荐结果根据用户兴趣程度和相似用户的行为进行排序和展示。 购买与交易:用户可以通过系统下单购买心仪的图书,并...
该图像搜索引擎以Python作为开发语言,利用OpenCV强大的图像处理和分析能力,对输入的查询图像进行特征提取和匹配。通过精心设计的算法,系统能够准确识别出与查询图像相似的图片,并按照相似度进行排序展示。这不仅...
这个基于SSM框架的快餐店点餐结算系统是一个旨在提升快餐店点餐效率和客户体验的Java项目。通过结合后端的SSM(Spring+Spring MVC+MyBatis)框架和前端的Vue.js框架,系统实现了快餐点餐、订单管理和结算功能,并...
这是一个为企事业单位量身定制的微信小程序项目申报系统,旨在提高项目申报的效率与便捷性。该系统集成了项目申报、审批、管理等一系列功能,采用现代化的信息技术手段,为企事业单位提供全方位的项目申报解决方案。...
数据结构与算法分析:C语言描述 高清版 PDF 带源码 非c++本书是《Data Structures and Algorithm Analysis in C》一书第2版的简体中译本。原书曾被评为20世纪顶尖的30部计算机著作之一,作者Mark Allen Weiss在数据...
你将看到各种算法(排序、搜寻、排列组合、数据移动与复制…)的实现;你甚至将看到底层的memory pool 和高阶抽象的traits 机制的实现。那些数据结构、那些算法、那些重要观念、那些编程实务中最重要最根本的珍宝,...
《数据结构与算法分析:Java语言描述 第2版 》是国外数据结构与算法分析方面的经典教材 使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计) 随着计算机速度...
利用该系统你能进行成绩表管理,包括建表、浏览、追加、修改、删除、查询、排序、统计分析等等功能,减少教师的重复劳动,提高工作效率。 该系统的版本V1.0,能够处理每学期科目不同的情况,可以随意设置科目名称,...
1、新增“线程_枚举”枚举指定进程ID中所有线程列表,成功返回线程数量,失败返回零。 2、删除“文件_取图标”与"文件_取图标句柄"功能重复。 3、优化“系统_创建桌面快捷方式”流程代码,感谢易友[ds9660]反馈。 4...
毕业设计,Docker基于ElasticSearch全文搜索引擎开发的旅游景点搜索网,包括前台用户端和后台管理端,完整源码 Docker基于ElasticSearch全文搜索引擎的旅游景点搜索网设计 开发环境: Idea + Mysql + ubuntu + ...
7. 数据处理:指标公式中涉及到多种数据处理操作,例如数据筛选、数据排序、数据计算等,掌握这些操作是数据分析和处理的基础。 8. 可视化表示:指标公式中使用了多种可视化表示方法,例如STICKLINE、DRAWTEXT、...
这些方法中,或将词典按词条长度排序或按词频排序,其目的在于协调算法与数据结构,使之效率最高。客观地说,它们都在一定程度上提高了分词的效率。 本文所介绍的是基于词典的最大向前匹配方法。而在数据结构方面,...
②实验要求:编写程序实现8数码和15数码问题,采用至少两种估价函数,分析估价函数求解问题时候的效率差别,分析估价函数对搜索算法的影响 3、解题思路 ①首先,定义一个open表和一个close表用于后续搜索,再定义一...
1. 完善运费计算模式,设置了五种运费计算模式,管理员可以后台自由设置,包括: A. 按照订单收取运费,每个订单一个运费 B. 按照商品收取运费,运费根据客户订购的商品自动累积 C. 根据重量计算运费,根据商品...