折半查找
int count=0; //记录查找次数
int Search_Bin(SSTable ST,KeyType key)
{ // 在顺序表ST中顺序查找其关键字等于 key的数据元素
int low=1,mid,high=ST.length; // 置区间初值
while(low<=high)
{
count++;
mid=(low+high)/2;
if(key==ST.elem[mid].key)
return mid; // 若找到,则函数值为该元素在表中的位置
else if(kval<ST.elem[mid].key)
high=mid-1; // 继续在前半区间进行查找
else low=mid+1; // 继续在后半区间进行查找
}
return 0; //找不到时,i为0
}
堆排序
void HeapAdjust(SqList &L,int s,int m)
{
rc=L.r[s];
for(j=2*s;j<=m;j*=2) //沿key较大的孩子结点向下筛选
{
if(j<&&L.r[j].key<L.r[j+1].key) ++j;//j为key较大的记录的下标
if(rc.key>=L.r[j].key) break;//rc应插入在位置s上
L.r[s]=L.r[j];s=j;
}
L.r[s]=rc;//插入
}
void CreatHeap(SqList &L)
{
n=L.length;
for(i=n/2;i>0;--i) //反复调用HeapAdjust
HeapAdjust(L,i,n);
}
void HeapSort(SqList &L)
{
CreatHeap(L); //将无序序列L,r[1..L..length]建成大根堆
for(i=L.length;i>1;--i)
{
x=L.r[1];//将堆顶记录和当前未经排序子序列L.r[1..i]中最后一个记录互换
L.r[1]=L.r[i];
L.r[i]=x;
HeapAdjust(L,1,i-1);//将L,r[1..i-1]重新调整为大根堆
}
}
快速排序
void QSort ( SqList &L,int low, int high )
{
if ( low < high ) //长度大于1
{
pivotloc = Partition(L, low, high );//将L.r[low..high]一分为二,pivotloc是枢轴位置
Qsort (L, low, pivotloc-1); //对左子表递归排序
Qsort (L, pivotloc+1, high); //对右子表递归排序
}
}
int Partition ( SqList &L,int low, int high )
{ //对顺序表L中的子表r[low...high]进行一趟排序,返回枢轴位置
L.r[0] = L.r[low];//用子表的第一个记录做枢轴记录
pivotkey = L.r[low].key;//枢轴记录关键字保存在pivotkey中
while ( low < high )//从表的两端交替地向中间扫描
{
while ( low < high && L.r[high].key >= pivotkey) --high;
L.r[low] = L.r[high];//将比枢轴记录小的记录移到低端
while ( low < high && L.r[low].key <= pivotkey) ++low;
L.r[high] = L.r[low];//将比枢轴大的记录移到高端
}
L.r[low]=L.r[0];//枢轴记录到位
return low;//返回枢轴位置
}
void QuickSort(SqList &L)
{//对顺序表L做快速排序
QSort(L,1,L.length);
}