c语言经典排序算法(8种-含源代码)(7)
发布时间:2021-06-06
发布时间:2021-06-06
鸡尾酒配方
* 将其与序列的最后一个元素交换,将序列长度减一;
* 再将序列建成堆(堆调整)后,堆顶元素仍是序列中的最大元素,再次将其与序列最后一个元素交换并缩短序列长度;
* 反复此过程,直至序列长度为一,所得序列即为排序后结果。
**************************************************************/
void HeapAdjust(int data[],int s,int m) /* 排列成堆的形式 */
{
int j,rc;
rc=data[s]; /* 保存处理元素 */
for(j=2*s;j<=m;j*=2) /* 处理父亲元素 */
{
if(j<m && data[j]<data[j+1]) ++j; /* 取较大的孩子节点 */
if(rc>data[j]) break;
data[s]=data[j]; /* 父节点比较大的孩子节点大则互换 ,保证父节点比所有子节点都大(父节点存储在前面)*/
s=j;
}
data[s]=rc; /* 相当于data[j]=rc */
}
void Heap_sort(int data[],int long_n) /* 堆排序函数 */
{
int i,temp;
for(i=long_n/2;i>0;--i) /* 还没有读懂这样处理的原因,希望大家不吝赐教 */ {
HeapAdjust(data,i,long_n); /* 处理后,data[i]是这个数组后半部分的最大值 */ }
for(i=long_n;i>0;--i)
{
temp=data[1]; /* 把根元素(剩下元素中最大的那个)放到结尾 ,下一次只要排剩下的数就可以啦*/
data[1]=data[i];
data[i]=temp;
HeapAdjust(data,1,i-1);
}
}
每个算法有什么优缺点,可以参照百度文库
地址:
/view/c3054c0f7cd184254b353516.html