您的位置:首页 > 其它

涂鸦-草稿:堆排序(1)

2017-06-07 22:33 225 查看

涂鸦-草稿:堆排序 (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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: