排序技术有很多种,下面简单介绍一下几种。
//直接顺序排序
void InsertSort(int r[], int n)
{
for (int i=2; i
//希尔排序
void ShellSort(int r[], int n)
{
int i;
int d;
int j;
for (d=n/2; d>=1; d=d/2) //以增量为d进行直接插入排序
{
for (i=d+1; i0 && r[0]
//起泡排序
void BubbleSort(int r[], int n)
{
int temp;
int exchange;
int bound;
exchange=n-1; //第一趟起泡排序的范围是r[0]到r[n-1]
while (exchange) //仅当上一趟排序有记录交换才进行本趟排序
{
bound=exchange;
exchange=0;
for (int j=0; jr[j+1])
{
temp=r[j];
r[j]=r[j+1];
r[j+1]=temp;
exchange=j; //记录每一次发生记录交换的位置
}
}
for(int i=0;i
//快速排序一次划分
int Partition(int r[], int first, int end)
{
int i=first; //初始化
int j=end;
int temp;
while (i
//简单选择排序
void SelectSort(int r[ ], int n)
{
int i;
int j;
int index;
int temp;
for (i=0; i
堆的定义
堆是具有下列性质的完全二叉树:每个结点的值都小于或等于其左右孩子结点的值(小根堆);或者每个结点的值都大于或等于其左右孩子结点的值(大根堆)。
假设当前要筛选结点的编号为k,堆中最后一个结点的编号为m,并且结点k的左右子树均是堆(即r[k+1] ~ r[m]满足堆的条件),则筛选算法用伪代码可描述为:
具体的筛选代码如下:
//筛选法调整堆
void Sift(int r[], int k, int m)
{
int i;
int j;
int temp;
i=k;
j=2*i+1; //置i为要筛的结点,j为i的左孩子
while (j<=m) //筛选还没有进行到叶子
{
if (jr[j]) break; //根结点已经大于左右孩子中的较大者
else
{
temp=r[i];
r[i]=r[j];
r[j]=temp; //将根结点与结点j交换
i=j;
j=2*i+1; //被筛结点位于原来结点j的位置
}
}
}
堆排序
堆排序的基本思想是:首先将待排序的记录序列构造成一个堆,此时,选出了堆中所有记录的最大者即堆顶记录,然后将它从堆中移走(通常将堆顶记录和堆中最后一个记录交换),并将剩余的记录再调整成堆,这样又找出了次大的记录,以此类推,直到堆中只有一个记录为止。
//堆排序
void HeapSort(int r[ ], int n)
{
int i;
int temp;
for (i=n/2; i>=0; i--) //初始建堆,从最后一个非终端结点至根结点
Sift(r, i, n) ;
for (i=n-1; i>0; i--) //重复执行移走堆顶及重建堆的操作
{
temp=r[i];
r[i]=r[0];
r[0]=temp;
Sift(r, 0, i-1);
}
for(i=0;i
//一次归并
void Merge(int r[], int r1[], int s, int m, int t)
{
int i=s;
int j=m+1;
int k=s;
while (i<=m && j<=t)
{
if (r[i]<=r[j])
r1[k++]=r[i++]; //取r[i]和r[j]中较小者放入r1[k]
else
r1[k++]=r[j++];
}
if (i<=m)
while (i<=m) //若第一个子序列没处理完,则进行收尾处理
r1[k++]=r[i++];
else
while (j<=t) //若第二个子序列没处理完,则进行收尾处理
r1[k++]=r[j++];
}
//一趟归并
void MergePass(int r[ ], int r1[ ], int n, int h)
{
int i=0;
int k;
while (i<=n-2*h) //待归并记录至少有两个长度为h的子序列
{
Merge(r, r1, i, i+h-1, i+2*h-1);
i+=2*h;
}
if (i
//归并排序的递归算法
void MergeSort2(int r[], int r1[], int r2[],int s, int t)
{
int m;
if (s==t)
{
r1[s]=r[s];
}
else
{
m=(s+t)/2;
MergeSort2(r, r2, r1, s, m); //归并排序前半个子序列
MergeSort2(r, r2, r1, m+1, t); //归并排序后半个子序列
Merge(r2, r1, s, m, t); //将两个已排序的子序列归并
}
}