常见排序算法及其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语言实现【修正版】
- 几种常见内部排序算法分析与实现(C语言描述)
- C语言实现几种常见排序算法
- 排序算法之堆排序<Heap_Sort>及其C语言代码实现
- 常见各种排序算法(C语言实现)
- 常见排序算法及其java实现
- 常见排序算法(冒泡,选择,快速)的C语言实现
- 排序算法之插入排序<Insertion_Sort>及其C语言代码实现
- 几种常见排序算法的c语言实现
- 排序算法之冒泡排序<Bubble_Sort>及其C语言代码实现
- 几种常见排序算法的c语言实现
- 排序算法要点及其C语言实现
- 几种常见排序算法的C语言实现
- 常见排序算法的C语言实现以及算法复杂度分析(持续更新)
- 排序算法之快速排序<Quick_Sort>及其C语言代码实现
- 排序算法之归并排序<Merge_Sort>及其C语言代码实现
- C语言8种排序算法及其实现 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序
- 常见排序算法(冒泡,选择,快速)的C语言实现
- 排序算法之希尔排序<Shell_Sort>及其C语言代码实现
- [置顶] 各种常见的排序算法及其实现