各种排序方法代码
学习了各种排序方法后,为加强记忆,在此重新复习一遍。
1----直接插入排序
直接插入排序为稳定的排序方法,原理是将一个记录插入到已经排序号的有序表中,从而得到一个新的,记录数增1的有序表。
算法:
void InsertSort(SqList& L)
{
for(int i=2;i<=L.length;i++)
{
if(L.r[i].key < L.r[i-1].key)
{
L.r[0]=L.r[i];
L.r[i]=L.r[i-1];
for(int j=i-1;(L.r[0].key < L.r[j].key);j--)
L.r[j]=L.r[j-1];
L.r[j]=L.r[0];
}
}
}
2----折半插入排序
也是一种插入排序,稳定的排序方法,原理是在一个有序表中进行插入和删除,查找的过程可以用折半查找来实现。
void BInsertSort(SqList& L)
{
for(int i=2;i<=L.length;i++)
{
L.r[0]=L.r[i];
int low=1,high=i-1;
while(low <= high)
{
int mid=(low + high)/2;
if(L.r[0].key < L.r[mid].key)
high=mid-1;
else
low=mid+1;
}
for(int j=i-1;j>=high+1;j--)
L.r[j+1]=L.r[j];
L.r[high+1]=L.r[0];
}
}
3----希尔排序
跳跃式的插入排序,不稳定的排序方法。增量序列最后一个值必须为1
void ShellInsert(Sqlist& L,int dk)
{
for(int i=dk+1;i<=L.length;i++)
{
if(L.r[i].key < L.r[i-dk].key)
{
L.r[0]=L.r[i];
for(int j=i-dk;j>0 && (L.r[0].key < L.r[j].key);j--)
L.r[j+dk]=L.r[j];
L.r[j+dk]=L.r[0];
}
}
}
void ShellSort(Sqlist& L,int dlta[],int t)
{
for(int k=0;k
ShellInsert(L,dlta[k]);
}
4----冒泡排序
基于交换的排序,是一种稳定的排序方法
void BubbleSort(Sqlist& L)
{
for(int i=1;i<=L.length;i++)
for(int j=1;j
{
if(L.r[j].key > L.r[j+1].key)
{
//交换记录值
}
}
}
5----快速排序
交换排序,基于枢轴的排序。
//
//交换顺序表L中子表L.r[low..high]的记录,使枢轴记录到位,并返回其所在位置。
//此时,在它之前的记录均不大于它,之后的记录均不小于它。
int Partition(SqList& L,int low,int high)
{
int pivotkey=L.r[low].key;//子表的第一个记录作枢轴
while (low < high)//从表的两端交替向中间扫描
{
while (low=pivotkey)
--high;//从后往前扫描,直到找到一个关键字比枢轴关键字小的记录
//此时交换这两个记录
RedType tmp;
tmp=L.r[low];
L.r[low]=L.r[high];
L.r[high]=tmp;
//交换过后,枢轴的值在L.r[high]位置
while(low
p;& L.r[low].key<=pivotkey)
low++;//从前往后扫描,直到找到一个关键字比枢轴关键字大的记录
//此时交换这两个记录
tmp=L.r[low];
L.r[low]=L.r[high];
L.r[high]=tmp;
//交换过