实现直接插入排序,二分法插入排序、希尔排序,冒泡排序,快速排序,直接选择排序的算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#define Max 100 //数组长度

typedef struct

{

int key; //关键字

char data; //其他字段

}LineList; //线性表的类型

void BubbleSort(LineList R[],int n)

{

int i,j,exchange;

LineList temp;

for(i=0;i

{

exchange = 0;

for(j=n-1;j>i;j--) //比较找出最小记录

if(R[j].key

{ //比较移行

temp=R[j];

R[j]=R[j-1];

R[j-1]=temp;

exchange=1;

}

if(exchange==0) //交换结束后结束return;

}

}

/* 直接插入排序,升序*/

void StraightInsertSort (LineList R[],int n) {

int i,j;

LineList temp;

for(i=1;i

{

temp=R[i];

j=i-1; //j从第一个开始比较while(j>=0 && temp.key

{ //元素后移让位给temp R[j+1]=R[j];

j--; //恢复前一个位置

}

R[j+1]=temp; //在j+1位置插入temp

}

}

/* 快速排序,升序*/

void QuickSort(LineList R[],int s,int t)

{ //对R[s]至R[t]的元素进行快速排序

int i=s,j=t;

LineList temp;

if(s

{

temp=R[s]; //用区间的第1个记录作为基准

while(i!=j) //从区间两端交替向中间扫描,直至i=j为止

{

while(j>i && R[j].key>temp.key)

{ //从右向左扫描,找第1个关键字小于temp.key的R[j] j--;

R[i]=R[j]; //找到这样的R[j],则R[i]和R[j]交换

while(i

i++; //从左向右扫描,找第1个关键字大于temp.key的R[i]

R[j]=R[i]; //找到这样的R[i],则R[i]和R[j]交换

}

R[i]=temp;

QuickSort(R,s,i-1); //对左区间递归排序

QuickSort(R,i+1,t); //对右区间递归排序

}

}

}

/* 二分法插入排序,升序*/

void BinarySort(LineList R[], int n)

{

int x;

int l, r, m;

int i, j;

/* 从最先的两个元素开始排序*/

for (i=1; i

{

x=R[i].key;

l=1; /* 下限*/

r=i-1; /* 上限*/

while (l<=r)

{

/* 中间位置*/

m=(l+r)/2;

if (x

else l=m+1; /* 下限上移*/

}

/* 插入元素*/

for (j=i-1; j>=l; j--)

R[j+1]=R[j];

R[l].key=x;

}

}

/* 直接选择排序,升序*/

void SelectSort(LineList R[],int n)

{

int i,j,k;

LineList tmp;

for (i=0;i

{

k=i;

for (j=i+1;j

if (R[j].key

k=j; //用k指出每趟在无序区段的最小元素

tmp=R[i]; //将R[k]与R[i]交换

R[i]=R[k];

R[k]=tmp;

}

}

/* 希尔排序,升序*/

void ShellSort(LineList R[],int n)

{

int i,j,gap;

LineList tmp;

gap=n/2; //增量置初值

while (gap>0)

{

for (i=gap;i

tmp=R[i];

j=i-gap;

while (j>=0 && tmp.key

R[j+gap]=R[j];

j=j-gap; //移到本组中的前一个元素

相关文档
最新文档