我是靠谱客的博主 现代大雁,最近开发中收集的这篇文章主要介绍《数据结构教程(李春葆主编 第五版)》第十章源代码—排序顺序表基本运算算法(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]='