说明:以下C++代码的实现参考严蔚敏的《数据结构(C语言版)》
实验目的:有序列{{49,1},{38,2},{65,3},{97,4},{76,5},{13,6},{27,7},{49,8}};其中{a,b}把a视为key,按照key的大小使用插入排序对序列进行排序
算法图示:
实验代码:
c10_1.cpp
#ifndef C10_1_H
#define C10_1_H
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef int KeyType;
typedef int InfoType;
typedef struct
{
KeyType key;
InfoType info;
}RedType;
typedef struct
{
RedType r[MAXSIZE+1];//r[0]闲置,用作哨兵单元(用来存储要插入的数)
int length;
}SqList;//连续的存储空间存储排序数据
class CLSort
{
private:
SqList *list;
public:
CLSort(SqList &list);
// CLSort(const CLSort &sort);//拷贝构造函数
void InsertSort();
void printSqList();
};
#endif
algorithm10_1.cpp
#include "c10_1.h"
CLSort::CLSort(SqList &list)
{
this->list = &list;
}
void CLSort::InsertSort()
{
int i,j;
for(i = 2; i<=(*list).length; i++)
{
if((*list).r[i].key<(*list).r[i-1].key)
{
(*list).r[0] = (*list).r[i];
// (*list).r[i] = (*list).r[i-1];
// for(j=i-2; (*list).r[0].key<(*list).r[j].key; j--)
for(j=i-1; (*list).r[0].key<(*list).r[j].key; j--)
{
(*list).r[j+1] = (*list).r[j];
}
(*list).r[j+1] = (*list).r[0];
}
}
}
void CLSort::printSqList()
{
for(int i=1; i<= (*list).length; i++)
{
cout<<(*list).r[i].key<<","<<(*list).r[i].info<<" ";
}
cout<<endl;
}
main10_1.cpp
#include "c10_1.h"
#define N 8
int main()
{
RedType d[N]={{49,1},{38,2},{65,3},{97,4},{76,5},{13,6},{27,7},{49,8}};
SqList list;
for(int i=1; i<=N; i++ )
{
list.r[i] = d[i-1];
}
list.length = N;
CLSort sort(list);
cout<<"排序前:"<<endl;
sort.printSqList();
sort.InsertSort();
cout<<"排序后:"<<endl;
sort.printSqList();
}
测试结果:
算法复杂度分析:
对于插入排序,如果含n个数的序列已经按从小到大排列好了,根据程序的实现可知程序只进行了n-1次数据比较和0次数据移动结束了程序的运行。当这个序列是从大到小排列时,程序执行时间最长,需要进行(n-1)(n+2)/2(即1+2+...+n-1+n-1)次数据比较,还需要进行(n-1)(n+4)/2(即2+3+...+n-1+n+n-1)次数据移动。由以上分析,(n-1+0+(n-1)(n+2)/2+(n-1)(n+4)/2)/2=(n-1)(n+4)/2,所以算法复杂度为O(n*n)