[原创]堆排序(C++版)
堆排序 时间复杂度:O(N*log2N)空间复杂度:O(1)不稳定的
下面的方式我是通过向下调整创建大根堆,然后通过向下调整进行堆排序。
//向下调整堆 void adjustDown(int A[], int k, int len){ int tmp = A[k]; for (int i = 2 * k + 1; i < len; i = 2 * i + 1){ if (i<len - 1 && A[i] < A[i + 1]) i++; if (tmp >= A[i]) break; if (A[i] > tmp){ A[k] = A[i]; k = i; } } A[k] = tmp; } //初始化,建立大根堆 void buildMaxHead(int A[], int len){ int i; for (i = len / 2-1; i >=0; i--) adjustDown(A,i,len); } //以向下调整的方式进行堆排序 void heapSort(int A[], int len){ buildMaxHead(A,len); for (int i = len - 1; i > 0; i--){ swap(A[i],A[0]); adjustDown(A,0,i); } }
另外还可以通过向上调整,以及创建小根堆的方式来进行堆排序,下面我只列出向上调整的方法函数,至于如何通过向上调整以及创建小根堆来实现堆排序,后面有机会再补充完善在该博文中:
//向上调整 void adjustUp(int A[], int k){ int tmp = A[k]; int i = k / 2; while (i >= 0 && tmp > A[i]){ A[k] = A[i]; k = i; i = i / 2; } A[k] = tmp; }
欢迎网友在评论中给出不同意见和看法!