{ // 长度大于 1
pivotloc = serchSort(L, low, high); //调用 serchSort()将 L.r[low..high]一分为
二
QSort(L, low, pivotloc-1); //对低子表递归排序,pivotloc 是枢轴位置
QSort(L, pivotloc+1, high); // 对高子表递归排序
}
}
⑤ 希尔排序 基本思路是先将整个待排序的记录分割成若干个子序列进行直接排序,待整
个序列中的记录“基本有序”时,再对全体记录进行一次全体直接插入排序
void ShellSort(Sqlist *L,int dlta[],int t) //希尔排序
{
for(k=1;k<=t;k++)
{
dlta[k]=(int)pow( 2, t-k+1 )-1;//double pow( double base, double
exp );函数返回以参数 base 为底的 exp 次幂
for(i=dlta[k]+1;i<=L->length;i++)
if(L->r[i].key < L->r[i-dlta[k]].key)
{
L->r[0] = L->r[i];
for(j=i-dlta[k];j>0 && (L->r[0].key < L->r[j].key);j-=dlta[k])
L->r[j+dlta[k]] = L->r[j];
L->r[j+dlta[k]] = L->r[0];
}
}
printf(L->r[MAXSIZE]);//输出排序后数组和相关数据
}
⑥ 堆排序 基本思想是使记录序列按关键字非递减有序排列,则再对排序的算法中先建立
一个“大顶堆”,即先选得一个关键字为最大的记录与序列中最后一个记录交换,然后再对
序列中前 n-1 记录进行筛选,重新将它调整为“大顶堆“,如此反复直至排序结束。
void HeapAdjust(Sqlist *L, int s, int m) { // 已 知 L.r[s..m] 中 记 录 的 关 键 字 除
L.r[s].key 之外均满足堆的定义,本函数调整 L.r[s]的关键字,使 L.r[s..m]成为一个大顶
堆(对其中记录的关键字而言)
rc = L->r[s];
for (j=2*s; j<=m; j*=2) { // 沿 key 较大的孩子结点向下筛选
if (j<m && 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 HeapSort(Sqlist *L) //堆排序
{
for(i=L->length/2;i>0;i--) //把 H->r[…]建成大顶堆
评论1
最新资源