数据结构期末复习-编程实现折半查找、堆排序和快速排序

折半查找

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sec0nd_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值