您的位置:首页 > 编程语言 > C语言/C++

常见排序算法及其C语言实现(二)

2017-08-11 11:03 253 查看
堆的基本操作及堆排序

void siftup(int *H, int i); //关于堆,所有的位置计算都从1开始。包括n代表个数。
void siftdown(int *H, int n, int i); //因此在数组操作的时候都要减一,其它位置均表示个数
void makeheap(int *H, int n);
void heapsort(int *A, int n);
void heapdelete(int *H, int n, int i);//默认n大于i,基本思想是和H
互换
void heapinsert(int *H, int n);//基本思想也是和H
互换

void heapdelete(int *H, int n, int i) {
int x, y;
x = A[i - 1];
y = A[n - 1];
A[i - 1] = A[n - 1];
if (y > x) {
siftup(A, i);
} else {
siftdown(A, n - 1, i);
}
}

void heapsort(int *A, int n) {
makeheap(A, n);
int j, temp;
for (j = n; j > 1; j--) {
temp = A[1-1];
A[1 - 1] = A[j - 1];
A[j - 1] = temp;
siftdown(A, j-1, 1); //堆在缩小
}
}

void makeheap(int *H, int n) { //从下往上建堆
for (int i = n / 2; i > 0; i--) {
siftdown(H, n, i);
}
}

void siftdown(int *H, int n, int i) { //将一个不正确的节点向下调整
int temp;
while (2 * i <= n) {
i = 2 * i;
if (i + 1 <= n) {
if (H[i] > H[i-1])
i = i + 1;
}
if (H[i / 2 - 1] < H[i-1]) {
temp = H[i / 2 - 1];
H[i / 2 - 1] = H[i - 1];
H[i - 1] = temp;
}
}
}

void siftup(int *H, int i) { //将一个不正确的子节点向上调整
int temp;

while (i != 1) {
if (H[i - 1] > H[i / 2 - 1]) {
temp = H[i - 1];
H[i - 1] = H[i / 2 - 1];
H[i / 2 - 1] = temp;
i = i / 2;
}
else {
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序算法 c语言