网站建设员性质,18款黄金软件,技术支持 重庆网站,买外链排序算法实现大全后面的例程#xff0c;都是对数组的排序#xff0c;使用静态链表的也适用于链表的排序。为简单起见#xff0c;只对单关键码排序#xff0c;并且最后的结果都是从头到尾按升序排列。下面是统一的测试程序#xff1a;#include #include using namespace st…排序算法实现大全后面的例程都是对数组的排序使用静态链表的也适用于链表的排序。为简单起见只对单关键码排序并且最后的结果都是从头到尾按升序排列。下面是统一的测试程序#include #include using namespace std;#include #include #include #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(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溢出另外有些递归的算法在情况比较糟的时候记录数目太多堆栈可能会溢出导致程序崩溃。插入排序基本思想是每步将一个待排序的记录按其关键码大小插入到前面已经排好序的记录的适当位置从头做到尾就可以了。直接插入排序template void InsertSort(T a[], int N, int KCN, int RMN){KCN 0; RMN 0;for (int i 1;