涂鸦-草稿:堆排序 (1)
晚上没啥事,随手练习写了下最简略版本的堆排序,当然,实际上还可以有很多优化~注释也没写…
这里是草稿~没事多写写,多练练~孰能生巧。
完全版本的改天整理一下再专门写篇Blog来坐下说明,额,这个代码没啥注释,将就看吧….
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
void print_arr(int *arr, int size)
{
int i;
for (i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
void siftup(int *arr, int pos)
{
if (pos == 0)
return;
int fatherPos = (pos - 1) / 2;
if (arr[fatherPos] > arr[pos])
{
int tmp = arr[fatherPos];
arr[fatherPos] = arr[pos];
arr[pos] = tmp;
return siftup(arr, fatherPos);
}
}
void siftdown(int *arr, int nowPos, int maxPos)
{
int left = nowPos * 2 + 1;
int right = nowPos * 2 + 2;
int minPos = nowPos;
if (left <= maxPos)
{
if (arr[left] < arr[minPos])
minPos = left;
if (right <= maxPos && arr[right] < arr[minPos])
minPos = right;
if (minPos != nowPos)
{
int tmp = arr[nowPos];
arr[nowPos] = arr[minPos];
arr[minPos] = tmp;
return siftdown(arr, minPos, maxPos);
}
}
}
void createHeap(int *arr, int size, int *p)
{
int i;
for (i = 0; i < size; i++)
{
p[i] = arr[i];
siftup(p, i);
}
}
void heapSort(int *arr, int size)
{
int *p = (int *)malloc(sizeof(int) * size);
memset(p, 0, sizeof(int) * size);
createHeap(arr, size, p);
printf("after cerateHeap:\n");
print_arr(p, size);
int index = 0;
while (size)
{
arr[index] = p[0];
printf("min is %d\n", p[0]);
p[0] = p[size-1];
index++;
size--;
printf("before siftdown:\n");
print_arr(p, size);
siftdown(p, 0, size-1);
printf("after siftdown:\n");
print_arr(p, size);
}
//memcpy(arr, p, sizeof(int) * size);
free(p);
p = NULL;
}
int main()
{
int arr[14] = {1, 2, 5, 12, 7, 17, 25, 19, 36, 99, 22, 28, 46, 92};
printf("original:\n");
print_arr(arr, 14);
heapSort(arr, 14);
printf("sorted:\n");
print_arr(arr, 14);
return 0;
}
[jiang@eb50 ~]$ ./main
original:
1 2 5 12 7 17 25 19 36 99 22 28 46 92
after cerateHeap:
1 2 5 12 7 17 25 19 36 99 22 28 46 92
min is 1
before siftdown:
92 2 5 12 7 17 25 19 36 99 22 28 46
after siftdown:
2 7 5 12 22 17 25 19 36 99 92 28 46
min is 2
before siftdown:
46 7 5 12 22 17 25 19 36 99 92 28
after siftdown:
5 7 17 12 22 28 25 19 36 99 92 46
min is 5
before siftdown:
46 7 17 12 22 28 25 19 36 99 92
after siftdown:
7 12 17 19 22 28 25 46 36 99 92
min is 7
before siftdown:
92 12 17 19 22 28 25 46 36 99
after siftdown:
12 19 17 36 22 28 25 46 92 99
min is 12
before siftdown:
99 19 17 36 22 28 25 46 92
after siftdown:
17 19 25 36 22 28 99 46 92
min is 17
before siftdown:
92 19 25 36 22 28 99 46
after siftdown:
19 22 25 36 92 28 99 46
min is 19
before siftdown:
46 22 25 36 92 28 99
after siftdown:
22 36 25 46 92 28 99
min is 22
before siftdown:
99 36 25 46 92 28
after siftdown:
25 36 28 46 92 99
min is 25
before siftdown:
99 36 28 46 92
after siftdown:
28 36 99 46 92
min is 28
before siftdown:
92 36 99 46
after siftdown:
36 46 99 92
min is 36
before siftdown:
92 46 99
after siftdown:
46 92 99
min is 46
before siftdown:
99 92
after siftdown:
92 99
min is 92
before siftdown:
99
after siftdown:
99
min is 99
before siftdown:
after siftdown:
sorted:
1 2 5 7 12 17 19 22 25 28 36 46 92 99
Over!改天再多写些,哈哈~
Happy Coding!