简单选择排序
算法:
Smp_Selecpass(ListType &r,int i)
{
k=i;
for(j=i+1;jif (r[j].keyk=j;if (k!=i)
{ t=r[i];r[i]=r[k];r[k]=t;}
}
Smp_Sort(ListType &r)
{
for(i=1;iSmp_Selecpass(r,i);}
堆排序
sift(ListType &r,int k,int m)
{
i=k;j=2*i;x=r[k].key;finished=FALSE;
t=r[k];
while((j<=m)&&(!finished))
{
if ((jr[j+1].key)) j++;if (x<=r[j].key)
finished:=TRUE;
else {r[i]=r[j];i=j;j=2*i;}
}
r[i]=t;
}
HeapSort(ListType &r)
{
for(i=n/2;i>0;i--) sift(r,i,n);
for(i=n;i>1;i--){
r[1]<->r[i];
sift(r,i,i-1)
}
}
归并排序
merge(ListType r,int l,int m,int n,ListType &r2)
{
i=l;j=m+1;k=l-1;
while(i<=m) and(j{k=k+1;
if (r[i].key<=r[j].key) {r2[k]=r[i];i++;}
else {r2[i]=r[j];j++}
}
if (i<=m) r2[k+1..n]=r[i..m];
if (j<=n) r2[k+1..n]=r[j..n];
}
mergesort(ListType &r,ListType &r1,int s,int t)
{
if (s==t)
r1[s]=r[s];
else
{
mergesort(r,r2,s,s+t/2);
mergesort(r,r2,s+t/2+1,t);
merge(r2,s,s+t/2,t,r1);
}
}
快速排序
int Partition (RedType R[], int low, int high) {
R[0] = R[low]; pivotkey = R[low].key; // 枢轴
while (lowwhile(low=pivotkey)-- high; // 从右向左搜索
R[low] = R[high];
while (low++ low; // 从左向右搜索R[high] = R[low];
}
R[low] = R[0]; return low;
}// Partition
void QSort ( SqList &L, int low, int high ) {
//对顺序表L中的子序列r[ low…high] 作快速排序
if ( low < high) {//长度>1
pivot = Partition ( L, low, high );
//一趟快排,将r[ ]一分为二
QSort ( L, low, pivot-1);
//在左子区间进行递归快排,直到长度为1
QSort ( L, pivot+1, high );
//在右子区间进行递归快排,直到长度为1
}
}
冒泡排序
void bubble_sort(SqList *L)
{ int m,i,j,flag=1;
RecordType x;
m=n-1;
while((m>0)&&(flag==1))
{flag=0;
for(j=1;j<=m;j++)
if(L->r[j].key>L->r[j+1].key)
{ flag=1;
x=L->r[j];
L->r[j]=L->r[j+1];
L->r[j+1]=x;
}
m--;
}
}
直接插入排序
void InsertionSort ( SqList &L ) {
// 对顺序表 L 作直接插入排序。
for ( i=2; i<=L.length; ++i )
if (L.r[i].key < L.r[i-1].key) {
L.r[0] = L.r[i]; // 复制为监视哨
for ( j=i-1; L.r[0].key < L.r[j].key; -- j )
L.r[j+1] = L.r[j]; // 记录后移
L.r[j+1] = L.r[0]; // 插入到正确位置
}
}