做课程设计时,写了一个排序的算法包,可用来分析常用的几种排序算法的交换,比较和移动等的次数。同时生成数据的方式有随机,正序和逆序等功能。这里拿来共享下,有什么错的,请指正!
先写个排序的数组类,以方便求取各种基本操作的次数/*
* 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
分享到:
相关推荐
在本资源包“算法试验源码+报告”中,包含了教师在课堂上教授的各种算法的实验内容。这个压缩包显然是一份宝贵的教育资源,适合学生学习和理解算法的实践应用。让我们详细探讨一下其中可能涉及的知识点。 首先,...
### 排序算法小结讲解+源码 #### 一、引言 排序算法作为计算机科学中的基础且常用算法,在实际应用中具有重要意义。随着数据量的不断增加,对排序算法的效率提出了更高要求。本文将从简单排序算法出发,逐步过渡到...
冒泡排序是计算机科学中基础的排序算法,虽然效率较低,但它能直观地展示排序过程。实现冒泡排序指令意味着学生需要考虑如何用硬件指令来控制数据的比较和交换,这涉及到了寄存器操作、内存访问和控制流程等方面的...
通过分析这些数据,可以得出在特定数据集上的排序效率,这对于了解算法在实际应用中的表现非常有价值。项目报告中可能会包含详细的实验设计、测试结果和结论,帮助我们理解哪种算法更适合处理特定类型或规模的数据。...
《QQ飞车全套易语言源码+模块》是一款专为编程初学者提供的学习资源,它包含了一系列使用易语言编写的代码,旨在帮助用户理解和掌握易语言的基础语法、编程技巧以及游戏开发的一些基本概念。易语言作为一款中国本土...
1. **基准元素选择**:不同的选取方式会影响排序效率。常见的有随机选取、首尾选取、中位数三数取中等。舍伍德可能探讨了这些策略的优劣。 2. **分区操作**:这是快速排序的核心部分,将数组分为小于和大于基准的两...
《VB+Access学生成绩管理系统源码与需求分析课程设计详解》 VB(Visual Basic)是一种基于事件驱动的编程语言,由微软开发,是Visual Studio的一部分。它以其易学易用、开发效率高而广受程序员喜爱。在教育领域,VB...
在提供的压缩包文件中,除了哈夫曼编码器的源码和文档外,还包含了各种内部排序算法的源码。这可以帮助学习者深入理解这些算法的实现细节,通过实际运行代码,观察不同算法在不同数据集上的表现,有助于提高对排序...
- 分析和理解源码后,可以尝试修改或优化算法,比如调整排序策略,加入多线程支持以提高排序效率。 - 学习其他编程语言的排序方法,如C++的`std::sort`或Java的`Arrays.sort`,可以帮助拓宽视野,更好地理解和运用...
在"backbone 源码+API"中,我们有两个主要的组成部分:`backbone-master.zip`和`underscore-master.zip`。 首先,`backbone-master.zip`包含了Backbone.js的源码。Backbone.js的源码对于深入理解其工作原理至关重要...
这些过滤器基于一种高级语法,源码分析可以帮助理解其匹配逻辑和执行效率。 4. 用户界面:Ethereal的图形用户界面(GUI)由GTK+库构建,提供友好的交互体验。源码分析可揭示如何将底层数据包解析结果与用户界面元素...
该系统以ASP(Active Server Pages)技术为核心,构建了一个功能完善的在线酒店预定平台,旨在提高酒店服务效率,提升客户预订体验。以下是基于该主题的详细知识点解析: 1. **ASP技术**:ASP是微软公司推出的一种...
为了有效地存储和处理用户行为数据,如浏览记录、购买历史等,开发者需要熟悉各种数据结构,如链表、树、哈希表等,并能根据需求选择合适的算法,例如排序、查找、统计分析等。 再者,项目中可能会用到数据库技术,...
在C#中,使用这些源码可以让你更深入地理解各种排序算法的工作原理,同时也可以直接应用到实际项目中,提高代码的效率和可读性。无论是学习还是开发,掌握不同排序算法的C#实现都是非常有价值的。通过阅读和实践这些...
5. **排序和查找**:如冒泡排序、选择排序、插入排序、快速排序、归并排序、二分查找等。这些都是基础的算法,对于优化数据处理效率至关重要。 6. **动态规划**:虽然不是特定的数据结构,但在解决复杂问题时,如...
这里我们主要探讨五种常见的排序算法,这些算法的源码你可以在提供的压缩包文件中找到:MergeSort(归并排序)、RadixSort(基数排序)、InsertionSort(插入排序)、SwapSort(可能是冒泡排序或快速排序的误称)...
通过C程序的实现,着重阐述了抽象数据类型的概念,并对算法的效率、性能和运行时间进行了分析。 《数据结构与算法分析:C语言描述》特色:着重讨论了算法设计技巧,包括贪婪算法、分治算法、动态规划、随机化算法...
本文将深入探讨两种交换排序算法——冒泡排序和快速排序的实现原理及源码分析。 **冒泡排序(Bubble Sort)** 冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的列表,一次比较两个元素,如果他们的顺序...
归并排序在最坏、最好和平均情况下都有O(n log n)的时间复杂度,因此在处理大量数据时效率较高。 3. 冒泡排序(BubbleSort.c): 冒泡排序是最基础的排序算法之一。它通过重复遍历数组,比较相邻元素并交换位置(如果...
1. 冒泡排序(Bubble Sort): 冒泡排序是最基础的排序方法,通过不断交换相邻的逆序元素来逐步实现排序。它的时间复杂度为O(n^2),适用于小规模或部分有序的数据集。源代码中,你可以看到如何设置循环和条件判断来...