由于14号要去招面试,于是百度了一下相关面经,看到一道题是讨论快速排序与堆排序的效率什么的…..在此之前,我对堆排序的理解是错误了=_=…之前我以为是每次调一次小根堆或者大根堆,然后就取出根元素,便可以得到一个排序的数组了….但是想想时间复杂度,感觉不对劲,于是就开始动手实现了。
参考了这篇文章对堆排序的讲解:https://www.cnblogs.com/chengxiao/p/6129630.html
看完后我才知道是把每次把根元素放到数组末端,然后再调整堆,于是乎就打算用python实现,但是由于python没有条件表达式,写着写着发现运算符:?: ,不能使用,于是乎改用C++去实现了=v=,好久没用C++了,以及在用python实现的过程中,想到了python的数组切片,于是乎我在C++中实现用到了。
上面网址的讲解我理解为:
1、排序为升序,大根堆,降序的话就小根堆。
2、每次调整堆后,把根元素换到当前调整的二叉树的最后节点,也就是数组末端。
3、每次把根与末端元素互换位置,换到末端的元素将不进行后续的调整,可以把它视为不在该树里面或者从二叉树中移除,就相当于每次调整的数组范围不同,所以用到切片。
int* dsort(int *arr, int len) {
if (len == 0) {
return arr;
}
int rear = len;
for (int pos = ((len+1) / 2 - 1); pos >= -1; pos--) {
if (pos < 0) {
swap(arr[0], arr[rear]);
rear--;
return dsort(arr, rear);
}
int tpos1 = 2 * pos + 1, tpos2 = 2 * pos + 2;
if (tpos2 <= len - 1) {
int tmpp = arr[tpos1] > arr[tpos2] ? tpos1 : tpos2;
bool is = arr[pos] > arr[tmpp] ? true : false;
if (!is) {
swap(arr[pos], arr[tmpp]);
}
}
else {
bool is = arr[pos] > arr[tpos1] ? true : false;
if (!is) {
swap(arr[pos], arr[tpos1]);
}
}
}
}
int main()
{
int a[] = { 9,6,8,10,4,3,1,11 };
int len = sizeof(a)/sizeof(a[0])-1;
int *b=dsort(a, len);
for (int i = 0; i <= len; i++) {
cout << b[i] << " ";
}
return 0;