现在的位置: 首页 > 综合 > 正文

算法进阶——插入排序

2018年04月25日 ⁄ 综合 ⁄ 共 1621字 ⁄ 字号 评论关闭

说明:以下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)/21+2+...+n-1+n-1)次数据比较,还需要进行(n-1)(n+4)/22+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)

抱歉!评论已关闭.