数据结构学习(C++)之排序

测试程序

后面的例程,都是对数组的排序,使用静态链表的也适用于链表的排序。为简单起见,只对单关键码排序,并且最后的结果都是从头到尾按升序排列。下面是统一的测试程序:

#include <iostream>
#include <iomanip>
using namespace std;
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "InsertSort.h"
#define random(num) (rand() % (num))
#define randomize() srand((unsigned)time(NULL))
#define N 10000 //排序元素的数目
#define SORT InsertSort //排序方法
class timer//单位ms
{
public:
void start() { start_t = clock(); }
clock_t time() { return (clock() - start_t); }
private:
clock_t start_t;
};
int KCN, RMN; timer TIMER;
void test(int a[])
{
TIMER.start();
SORT<int>(a, N, KCN, RMN);
cout << "\tTimeSpared: " << TIMER.time() << "ms" << endl;
cout << "KCN=" << left << setw(11) << KCN;
cout << "KCN/N=" << left << setw(11)<< (double)KCN/N;
cout << "KCN/N^2=" << left << setw(11)<< (double)KCN/N/N;
cout << "KCN/NlogN=" << left << setw(11)<< (double)KCN/N/log((double)N)*log(2.0) << endl;
cout << "RMN=" << left << setw(11) << RMN;
cout << "RMN/N=" << left << setw(11)<< (double)RMN/N;
cout << "RMN/N^2=" << left << setw(11)<< (double)RMN/N/N;
cout << "RMN/NlogN=" << left << setw(11)<< (double)RMN/N/log((double)N)*log(2.0) << endl;
}
int main()
{
int i;
//randomize();为了在相同情况下比较各个排序算法,不加这句
int* ascending = new int[N];//升序序列
int* descending = new int[N];//降序序列
int* randomness = new int[N];//随机序列
for (i = 0; i < N; i++) { ascending[i] = i; randomness[i] = i; descending[i] = N - i - 1;}
for (i = 0; i < N; i++) swap(randomness[i], randomness[random(N)]);
cout << "Sort ascending N=" << N; test(ascending);
cout << "Sort randomness N=" << N; test(randomness);
cout << "Sort descending N=" << N; test(descending);
return 0;
}

需要说明一点,KCN(关键码比较次数)、RMN(记录移动次数)并不是算法必须的,是为了对算法的性能有个直观的评价(不用那些公式算来算去)。对10000个整数排序应该是最省事的测试手段,建议不要再增多记录数目了,一是在最坏的情况不用等太久的时间,二是避免KCN、RMN溢出,另外有些递归的算法在情况比较糟的时候,记录数目太多堆栈可能会溢出,导致程序崩溃。

时间: 2024-10-30 05:49:29

数据结构学习(C++)之排序的相关文章

python算法学习之计数排序实例_python

python算法学习之计数排序实例 复制代码 代码如下: # -*- coding: utf-8 -*- def _counting_sort(A, B, k):    """计数排序,伪码如下:    COUNTING-SORT(A, B, k)    1  for i ← 0 to k // 初始化存储区的值    2    do C[i] ← 0    3  for j ← 1 to length[A] // 为各值计数    4    do C[A[j]] ← C[A

Python高级数据结构学习教程

本文虽然不是很深入,不过实例比较多,学习Python高级数据结构的好基础教程. 数据结构的概念 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供选择,例如Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint.本文将介绍

数据结构学习(C++)之双向链表

原书这部分内容很多,至少相对于循环链表是很多.相信当你把单链表的指针域搞清楚后,这部分应该难不倒你.现在我的问题是,能不能从单链表派生出双向链表?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />你可以有几种做法: 一种就是先定义一个双链节点--但是,它的名字必须叫Node,这是没办法的事:不然你就只好拷贝一份单链表的实现文件,把其中的Node全都替换成你的双链节点名字,但

数据结构学习笔记

在网上有较多的数据结构视频课,我通过学习邓俊辉的网课免费视频来学习的.他的视频讲得还很详细,比较适合刚入门的与那些即将毕业,找工作但是数据结构比较薄弱的同学来学习. 向量 有很多接口方法. 可扩充向量:总容量capacity,size当前的实际规模.当size不及capacity一半是,会下溢(装填因子=size/capacity). 动态空间管理:当即将上溢时,就会适当的扩容.

数据结构与算法之排序—看不懂你来打我吧

下面主要写了数据结构课本上介绍的「十种排序算法」,趁着快考试了复习一波排序,有图有真相,看不懂打死我吧. 堆排序.快速排序.希尔排序.直接选择排序不是稳定的排序算法,而基数排序.冒泡排序.直接插入排序.折半插入排序.链表插入排序.归并排序是稳定的排序算法. 直接插入排序 T(n) = O(n^2) 直接插入排序「Insertion Sort」的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止. 设数组为a[0-n-1]: 初始时

Lucene5学习之自定义排序

         在Lucene5学习之排序-Sort中,我们已经学习了Sort的用法,已经了解了,Lucene搜索返回的命中结果默认是按照索引文档跟搜索关键字的相关度已经排序的,而相关度又是基于内部的打分机制和索引文档id,内部的打分机制则是根据Term的IDF-TF以及创建索引时Field的boost等决定的,默认是按照得分降序排序,得分相同再按docId升序排序.如果你觉得默认的排序方式满足不了你的需求,你可以设置SortField按照特定的域来排序,特定的域排序其实根据域的type类型去

数据结构学习笔记--队列

引子:只有学习才是激情的生命,才是燃烧的岁月,才是完美的人生 声明:本笔记由<嵌入式系统软件设计中的数据结构>产生,旨在提升自己的软件设计水平,绝无侵权行为,望转载者备注说明 一 队列逻辑结构 1 是一种只允许在表的一端-"队尾"进行插入,而在另一端-"队头"进行删除的线性表.实则为线性表的一种特例.也称为先进先出表 2 当队列中没有结点时称为空队列.队列的修改是依照先进先出的原则进行的 二 队列的基本运算 置空队 SetNull(Q):将队列 Q 置成

答读者问(24):一个大二学生有关数据结构学习的疑问及答复

       最近,在V众投上有一个标题为"最近学习数据结构陷入了死循环大脑一片空白"的问题(http://www.vzhongtou.com/question/744),具体内容如下:         大一下学期学历c语言 学了半吊子 大二一开学就开始讲数据结构 没学过汇编啥的 我知道c语言的指针很重要就复习了指针现在对指针有所了解 老师讲课是一星期讲两节大课 一大章一节讲课一节上机 只讲伪算法 现在讲到树了感觉太抽象了完全搞不懂 本人数学基础比较薄弱 另外感觉自己的逻辑和抽象思维有

通过改写算法获得数据结构学习的更佳效果

[事件] 某名数据结构基础网络学员在"单链表的基本算法"部分连问两个问题: 老师,我while语句里面j<i-1改为j<i,else里面直接q=p可以么? 老师,你这样万一刚好q->next==NULL呢,这样没影响吧? 我的"即时"回答,也已经是10个小时之后了,我不知道他看到解答后,状态还在不在.另外,这种问题,并非是可以.不行就简单回答的,背后很细致的考量,用有限的文字根本说不清楚. 这名认真学习.主动思考的学员,此时需要的是在学习方法上的改