我是靠谱客的博主 现代大雁,最近开发中收集的这篇文章主要介绍《数据结构教程(李春葆主编 第五版)》第十章源代码—排序顺序表基本运算算法(seqlist.cpp)直接插入排序算法折半插入排序算法希尔排序算法冒泡排序算法改进的冒泡排序算法快速排序算法简单选择排序算法堆排序算法最低位优先的基数排序算法自底向上的二路归并排序算法自顶向下的二路归并排序算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

顺序表基本运算算法(seqlist.cpp)

#include <stdio.h>
#define MAXL 100		//最大长度
typedef int KeyType;	//定义关键字类型为int
typedef char InfoType;

typedef struct
{	KeyType key;		//关键字项
	InfoType data;		//其他数据项,类型为InfoType
} RecType;				//查找元素的类型

void swap(RecType x,RecType y)	//x和y交换
{
	RecType tmp=x;
	x=y; y=tmp;
}

void CreateList(RecType R[],KeyType keys[],int n)	//创建顺序表
{
	for (int i=0;i<n;i++)			//R[0..n-1]存放排序记录
		R[i].key=keys[i];
}

void DispList(RecType R[],int n)	//输出顺序表
{
	for (int i=0;i<n;i++)
		printf("%d ",R[i].key);
	printf("n");
}
//----以下运算针对堆排序的程序
void CreateList1(RecType R[],KeyType keys[],int n)	//创建顺序表
{
	for (int i=1;i<=n;i++)			//R[1..n]存放排序记录
		R[i].key=keys[i-1];
}
void DispList1(RecType R[],int n)	//输出顺序表
{
	for (int i=1;i<=n;i++)
		printf("%d ",R[i].key);
	printf("n");
}

直接插入排序算法

#include "seqlist.cpp"
void InsertSort(RecType R[],int n) //对R[0..n-1]按递增有序进行直接插入排序
{	int i, j; RecType tmp;
	for (i=1;i<n;i++) 
	{
		if (R[i].key<R[i-1].key)	//反序时 
		{	
			tmp=R[i];
			j=i-1; 
			do					//找R[i]的插入位置 
			{
				R[j+1]=R[j];   	//将关键字大于R[i].key的记录后移
				j--;
			}  while  (j>=0 && R[j].key>tmp.key);
			R[j+1]=tmp;      		//在j+1处插入R[i]
		}
		printf("  i=%d: ",i); DispList(R,n);
	}
}

int main()
{
	int n=10;
	RecType R[MAXL];
	KeyType a[]={9,8,7,6,5,4,3,2,1,0};
	CreateList(R,a,n);
	printf("排序前:"); DispList(R,n);
	InsertSort(R,n);
	printf("排序后:"); DispList(R,n);
	return 1;
}

折半插入排序算法

#include "seqlist.cpp"
void BinInsertSort(RecType R[],int n)
{	int i, j, low, high, mid;
	RecType tmp;
	for (i=1;i<n;i++) 
	{
		if (R[i].key<R[i-1].key)		//反序时 
		{
			tmp=R[i];		  			//将R[i]保存到tmp中
	     	low=0;  high=i-1;
			while (low<=high)	  		//在R[low..high]中查找插入的位置
			{
				mid=(low+high)/2;		//取中间位置
				if (tmp.key<R[mid].key)
					high=mid-1;			//插入点在左半区
				else 
					low=mid+1;			//插入点在右半区
			}                          	//找位置high
			for (j=i-1;j>=high+1;j--)	//集中进行元素后移
				R[j+1]=R[j];
			R[high+1]=tmp;				//插入tmp 
		}
		printf("  i=%d: ",i);
		DispList(R,n);
	} 
}

int main()
{
	int n=10;
	RecType R[MAXL];
	KeyType a[]={9,8,7,6,5,4,3,2,1,0};
	CreateList(R,a,n);
	printf("排序前:"); DispList(R,n);
	BinInsertSort(R,n);
	printf("排序后:"); DispList(R,n);
	return 1;
}

希尔排序算法

#include "seqlist.cpp"
void ShellSort(RecType R[],int n) //希尔排序算法
{	int i,j,d;
	RecType tmp;
	d=n/2;					//增量置初值
	while (d>0)
	{	for (i=d;i<n;i++) 	//对所有组采用直接插入排序
		{	tmp=R[i];		//对相隔d个位置一组采用直接插入排序
			j=i-d;
			while (j>=0 && tmp.key<R[j].key)
			{	R[j+d]=R[j];
				j=j-d;
			}
			R[j+d]=tmp;
		}
		printf("  d=%d: ",d); DispList(R,n);
		d=d/2;				//减小增量
	}
}

int main()
{
	int n=10;
	RecType R[MAXL];
	KeyType a[]={9,8,7,6,5,4,3,2,1,0};
	CreateList(R,a,n);
	printf("排序前:"); DispList(R,n);
	ShellSort(R,n); 
	printf("排序后:"); DispList(R,n);
	return 1;
}

冒泡排序算法

#include "seqlist.cpp"
void BubbleSort(RecType R[],int n)
{
	int i,j,k;
	RecType tmp;
	for (i=0;i<n-1;i++) 
	{
		for (j=n-1;j>i;j--)	//比较,找出本趟最小关键字的记录
			if (R[j].key<R[j-1].key)   
			{
				tmp=R[j];  //R[j]与R[j-1]进行交换,将最小关键字记录前移
				R[j]=R[j-1];
				R[j-1]=tmp;
			}
		printf("  i=%d: ",i);
		DispList(R,n);
	}
} 

int main()
{
	int n=10;
	RecType R[MAXL];
	KeyType a[]={9,8,7,6,5,4,3,2,1,0};
	CreateList(R,a,n);
	printf("排序前:"); DispList(R,n);
	BubbleSort(R,n); 
	printf("排序后:"); DispList(R,n);
	return 1;
}

改进的冒泡排序算法

#include "seqlist.cpp"
void BubbleSort1(RecType R[],int n)
{	int i,j;
	bool exchange;
	RecType tmp;
	for (i=0;i<n-1;i++) 
	{	exchange=false;					//一趟前exchange置为假
		for (j=n-1;j>i;j--)				//归位R[i],循环n-i-1次
			if (R[j].key<R[j-1].key)	//相邻两个元素反序时
			{	tmp=R[j];				//将这两个元素交换
				R[j]=R[j-1];
				R[j-1]=tmp;
				exchange=true;			//一旦有交换,exchange置为真
			}
		printf("  i=%d: ",i);
		DispList(R,n);
		if (!exchange)					//本趟没有发生交换,中途结束算法
			return;
	}
}

int main()
{
	int n=10;
	RecType R[MAXL];
	KeyType a[]={0,1,7,2,5,4,3,6,8,9};
	CreateList(R,a,n);
	printf("排序前:"); DispList(R,n);
	BubbleSort1(R,n);  
	printf("排序后:"); DispList(R,n);
	return 1;
}

快速排序算法

#include "seqlist.cpp"
int count=0;
int partition(RecType R[],int s,int t)	//一趟划分
{
	int i=s,j=t;
	RecType tmp=R[i];			//以R[i]为基准
	while (i<j)  				//从两端交替向中间扫描,直至i=j为止
	{	while (j>i && R[j].key>=tmp.key)
			j--;				//从右向左扫描,找一个小于tmp.key的R[j]
		R[i]=R[j];				//找到这样的R[j],放入R[i]处
		while (i<j && R[i].key<=tmp.key)
			i++;				//从左向右扫描,找一个大于tmp.key的R[i]
		R[j]=R[i];				//找到这样的R[i],放入R[j]处
	}
	R[i]=tmp;
	return i;
}

void QuickSort(RecType R[],int s,int t) //对R[s..t]的元素进行快速排序
{	int i;
	RecType tmp;
	if (s<t) 					//区间内至少存在两个元素的情况
	{	count++;
		i=partition(R,s,t);
		DispList(R,10);			//调试用
		QuickSort(R,s,i-1);		//对左区间递归排序
		QuickSort(R,i+1,t);		//对右区间递归排序
	}
}
/*
int main()
{
	int i,n=10;
	RecType R[MAXL];
	KeyType a[]={15,18,29,12,35,32,27,23,10,20};
	CreateList(R,a,n);
	printf("排序前:"); DispList(R,n);
	QuickSort(R,0,n-1);
	printf("排序后:"); DispList(R,n);
	return 1;
}
*/

int main()
{
	int i,n=10;
	RecType R[MAXL];
	KeyType a[]={6,8,7,9,0,1,3,2,4,5};
	CreateList(R,a,n);
	printf("排序前:"); DispList(R,n);
	QuickSort(R,0,n-1);
	printf("排序后:"); DispList(R,n);
	printf("count=%dn",count);
	return 1;
}

简单选择排序算法

#include "seqlist.cpp"
void SelectSort(RecType R[],int n)
{
	int i,j,k;
	RecType temp;
	for (i=0;i<n-1;i++)    	 	//做第i趟排序
	{
		k=i;
		for (j=i+1;j<n;j++)  	//在当前无序区R[i..n-1]中选key最小的R[k]
			if (R[j].key<R[k].key)
				k=j;           	//k记下目前找到的最小关键字所在的位置
			if (k!=i)          		//交换R[i]和R[k]
			{
				temp=R[i];
				R[i]=R[k];
				R[k]=temp;  
			}
		printf("  i=%d: ",i); DispList(R,n);
	}
}

int main()
{
	int n=10;
	RecType R[MAXL];
	KeyType a[]={9,8,7,6,5,4,3,2,1,0};
	CreateList(R,a,n);
	printf("排序前:"); DispList(R,n);
	SelectSort(R,n);
	printf("排序后:"); DispList(R,n);
	return 1;
}

堆排序算法

#include "seqlist.cpp"
void sift(RecType R[],int low,int high)
{
	int i=low,j=2*i;     					//R[j]是R[i]的左孩子
	RecType temp=R[i];
	while (j<=high) 
	{
		if (j<high && R[j].key<R[j+1].key) 	//若右孩子较大,把j指向右孩子
			j++;    						//变为2i+1
		if (temp.key<R[j].key) 
		{
			R[i]=R[j];              		//将R[j]调整到双亲结点位置上
			i=j;                    		//修改i和j值,以便继续向下筛选
			j=2*i;
		}
		else break;                 		//筛选结束
	}
	R[i]=temp;                      		//被筛选结点的值放入最终位置
}

void HeapSort(RecType R[],int n)
{
	int i;
	RecType tmp;
	for (i=n/2;i>=1;i--)	//循环建立初始堆,调用sift算法 n/2 次
		sift(R,i,n); 
	printf("初始堆:"); DispList1(R,n);
	for (i=n;i>=2;i--)		//进行n-1趟完成推排序,每一趟堆排序的元素个数减1
	{	tmp=R[1];			//将最后一个元素与根R[1]交换
		R[1]=R[i];
		R[i]=tmp;
		printf("第%d趟: ",n-i+1); DispList1(R,n);
		sift(R,1,i-1);		//对R[1..i-1]进行筛选,得到i-1个节点的堆
		printf("筛选为:"); DispList1(R,n);
	}
}

int main()
{
	int n=10;
	RecType R[MAXL];
	KeyType a[]={15,18,29,12,35,32,27,23,10,20};
	CreateList1(R,a,n);
	printf("排序前:"); DispList1(R,n);
	HeapSort(R,n);
	printf("排序后:"); DispList1(R,n);
	return 1;
}

/*
int main()
{
	int n=10;
	RecType R[MAXL];
	KeyType a[]={0,9,8,7,6,5,4,3,2,1,0};
	CreateList1(R,a,n);
	printf("排序前:"); DispList1(R,n);
	HeapSort(R,n);
	printf("排序后:"); DispList1(R,n);
	return 1;
}
*/

最低位优先的基数排序算法

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define MAXE 20			//线性表中最多元素个数
#define MAXR 10			//基数的最大取值
#define MAXD 8			//关键字位数的最大取值
typedef struct node
{	
	char data[MAXD];	//记录的关键字定义的字符串
    struct node *next;
} NodeType;
void CreaLink(NodeType *&p,char *a[],int n);
void DispLink(NodeType *p);
void RadixSort(NodeType *&p,int r,int d) //实现基数排序:p为待排序序列链表指针,r为基数,d为关键字位数
{
	NodeType *head[MAXR],*tail[MAXR],*t;//定义各链队的首尾指针
	int i,j,k;
	for (i=0;i<=d-1;i++)           		//从低位到高位循环
	{	
		for (j=0;j<r;j++) 				//初始化各链队首、尾指针
			head[j]=tail[j]=NULL;
		while (p!=NULL)          		//对于原链表中每个结点循环
		{	
			k=p->data[i]-'0';   		//找第k个链队
			if (head[k]==NULL)   		//进行分配
			{
				head[k]=p;
				tail[k]=p;
			}
          	else
			{
              	tail[k]->next=p;
				tail[k]=p;
			}
            p=p->next;             		//取下一个待排序的元素
		}
		p=NULL;							//重新用p来收集所有结点
       	for (j=0;j<r;j++)        		//对于每一个链队循环
        	if (head[j]!=NULL)         	//进行收集
			{	
				if (p==NULL)
				{
					p=head[j];
					t=tail[j];
				}
				else
				{
					t->next=head[j];
					t=tail[j];
				}
			}
		t->next=NULL;					//最后一个结点的next域置NULL
		printf("  按%s位排序t",(i==0?"个":"十"));
		DispLink(p);
	}
}

void CreateLink(NodeType *&p,char a[MAXE][MAXD],int n)	//采用后插法产生链表
{
	int i;
	NodeType *s,*t;
	for (i=0;i<n;i++)
	{
		s=(NodeType *)malloc(sizeof(NodeType));
		strcpy(s->data,a[i]);
		if (i==0)
		{
			p=s;t=s;
		}
		else
		{
			t->next=s;t=s;
		}
	}
	t->next=NULL;
}
void DispLink(NodeType *p)	//输出链表
{
	while (p!=NULL)
	{
		printf("%c%c ",p->data[1],p->data[0]);
		p=p->next;
	}
	printf("n");
}

void main()
{
	int n=10,r=10,d=2;
	int i,j,k;
	NodeType *p;
	char a[MAXE][MAXD];
	int b[]={75,23,98,44,57,12,29,64,38,82};
	for (i=0;i<n;i++)		//将b[i]转换成字符串
	{
		k=b[i];
		for (j=0;j<d;j++)	//例如b[0]=75,转换后a[0][0]='7',a[0][1]='5'
		{
			a[i][j]=k%10+'0';
			k=k/10;
		}
		a[i][j]='';
	}
	CreateLink(p,a,n);
	printf("n");
	printf("  初始关键字t");		//输出初始关键字序列
	DispLink(p);
	RadixSort(p,10,2);
	printf("  最终结果t");			//输出最终结果
	DispLink(p);
	printf("n");
}

自底向上的二路归并排序算法

#include <malloc.h>
#include "seqlist.cpp"

void Merge(RecType R[],int low,int mid,int high) 
{
	RecType *R1;
	int i=low,j=mid+1,k=0; //k是R1的下标,i、j分别为第1、2段的下标
	R1=(RecType *)malloc((high-low+1)*sizeof(RecType));  //动态分配空间
	while (i<=mid && j<=high)     	//在第1段和第2段均未扫描完时循环
		if (R[i].key<=R[j].key)    	//将第1段中的记录放入R1中
		{
			R1[k]=R[i];
			i++;k++; 
		}
		else                       		//将第2段中的记录放入R1中
		{
			R1[k]=R[j];
			j++;k++; 
		}
	while (i<=mid)          	       	//将第1段余下部分复制到R1
	{ 
		R1[k]=R[i];
		i++;k++; 
	}
    while (j<=high)                	//将第2段余下部分复制到R1
	{
		R1[k]=R[j];
		j++;k++;  
	}
    for (k=0,i=low;i<=high;k++,i++) //将R1复制回R中
	    R[i]=R1[k];
} 

void MergePass(RecType R[],int length,int n)	//对整个数序进行一趟归并
{
	int i;
	for (i=0;i+2*length-1<n;i=i+2*length) 	//归并length长的两相邻子表
		Merge(R,i,i+length-1,i+2*length-1);
	if (i+length-1<n-1)                		//余下两个子表,后者长度小于length
		Merge(R,i,i+length-1,n-1);  		//归并这两个子表
	printf("length=%d: ",length);
	DispList(R,n);
}

void MergeSort(RecType R[],int n)			//自底向上的二路归并算法
{
	int length;
	for (length=1;length<n;length=2*length)//进行log2n趟归并
		MergePass(R,length,n);
}

int main()
{
	int n=10;
	RecType R[MAXL];
	KeyType a[]={9,8,7,6,5,4,3,2,1,0};
	CreateList(R,a,n);
	printf("   排序前:"); DispList(R,n);
	MergeSort(R,n);
	printf("   排序后:"); DispList(R,n);
	return 1;
}

自顶向下的二路归并排序算法

#include <malloc.h>
#include "seqlist.cpp"
void Merge(RecType R[],int low,int mid,int high) 
{
	RecType *R1;
	int i=low,j=mid+1,k=0; //k是R1的下标,i、j分别为第1、2段的下标
	R1=(RecType *)malloc((high-low+1)*sizeof(RecType));  //动态分配空间
	while (i<=mid && j<=high)     	//在第1段和第2段均未扫描完时循环
		if (R[i].key<=R[j].key)    	//将第1段中的记录放入R1中
		{
			R1[k]=R[i];
			i++;k++; 
		}
		else                       		//将第2段中的记录放入R1中
		{
			R1[k]=R[j];
			j++;k++; 
		}
	while (i<=mid)          	       	//将第1段余下部分复制到R1
	{ 
		R1[k]=R[i];
		i++;k++; 
	}
    while (j<=high)                	//将第2段余下部分复制到R1
	{
		R1[k]=R[j];
		j++;k++;  
	}
    for (k=0,i=low;i<=high;k++,i++) //将R1复制回R中
	    R[i]=R1[k];
} 

void MergeSortDC(RecType R[],int low,int high)
//对R[low..high]进行二路归并排序
{
	int mid;
	if (low<high)
	{	mid=(low+high)/2;
		MergeSortDC(R,low,mid);
		MergeSortDC(R,mid+1,high);
		Merge(R,low,mid,high);		
	}
}

void MergeSort1(RecType R[],int n)	//自顶向下的二路归并算法
{
	MergeSortDC(R,0,n-1);
}

int main()
{
	int n=10;
	RecType R[MAXL];
	KeyType a[]={9,8,7,6,5,4,3,2,1,0};
	CreateList(R,a,n);
	printf("排序前:"); DispList(R,n);
	MergeSort1(R,n);
	printf("排序后:"); DispList(R,n);
	return 1;
}

最后

以上就是现代大雁为你收集整理的《数据结构教程(李春葆主编 第五版)》第十章源代码—排序顺序表基本运算算法(seqlist.cpp)直接插入排序算法折半插入排序算法希尔排序算法冒泡排序算法改进的冒泡排序算法快速排序算法简单选择排序算法堆排序算法最低位优先的基数排序算法自底向上的二路归并排序算法自顶向下的二路归并排序算法的全部内容,希望文章能够帮你解决《数据结构教程(李春葆主编 第五版)》第十章源代码—排序顺序表基本运算算法(seqlist.cpp)直接插入排序算法折半插入排序算法希尔排序算法冒泡排序算法改进的冒泡排序算法快速排序算法简单选择排序算法堆排序算法最低位优先的基数排序算法自底向上的二路归并排序算法自顶向下的二路归并排序算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部