[数据结构]堆排序
2014-04-19 15:08
232 查看
1,堆排序
概念
点击打开链接
点击打开链接
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2
堆的插入与删除
堆的插入:每次插入都是将新数据放在数组最后
堆的删除:
按定义,堆中每次都只能删除第0个数据。为了便于重建堆,实际的操作是将最后一个数据的值赋给根结点,然后再从根结点开始进行一次从上向下的调整。
堆排序:
首先可以看到堆建好之后堆中第0个数据是堆中最小的数据。取出这个数据再执行下堆的删除操作。
这样堆中第0个数据又是堆中最小的数据,重复上述步骤直至堆中只有一个数据时就直接取出这个数据。
概念
点击打开链接
点击打开链接
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2
堆的插入与删除
堆的插入:每次插入都是将新数据放在数组最后
堆的删除:
按定义,堆中每次都只能删除第0个数据。为了便于重建堆,实际的操作是将最后一个数据的值赋给根结点,然后再从根结点开始进行一次从上向下的调整。
堆排序:
首先可以看到堆建好之后堆中第0个数据是堆中最小的数据。取出这个数据再执行下堆的删除操作。
这样堆中第0个数据又是堆中最小的数据,重复上述步骤直至堆中只有一个数据时就直接取出这个数据。
建堆过程C语言表示: 1: /* 2: 输入:数组A,堆的长度hLen,以及需要调整的节点i 3: 功能:调堆 4: */ 5: 6: void AdjustHeap(int A[], int hLen, int i) 7: { 8: int left = LeftChild(i); //节点i的左孩子 9: int right = RightChild(i); //节点i的右孩子节点 10: int largest = i; 11: int temp; 12: 13: while(left < hLen || right < hLen) 14: { 15: if (left < hLen && A[largest] < A[left]) 16: { 17: largest = left; 18: } 19: 20: if (right < hLen && A[largest] < A[right]) 21: { 22: largest = right; 23: } 24: 25: if (i != largest) //如果最大值不是父节点 26: { 27: temp = A[largest]; //交换父节点和和拥有最大值的子节点交换 28: A[largest] = A[i]; 29: A[i] = temp; 30: 31: i = largest; //新的父节点,以备迭代调堆 32: left = LeftChild(i); //新的子节点 33: right = RightChild(i); 34: } 35: else 36: { 37: break; 38: } 39: } 40: } 41: 42: /* 43: 输入:数组A,堆的大小hLen 44: 功能:建堆 45: */ 46: void BuildHeap(int A[], int hLen) 47: { 48: int i; 49: int begin = hLen/2 - 1; //最后一个非叶子节点 50: for (i = begin; i >= 0; i--) 51: { 52: AdjustHeap(A, hLen, i); 53: } 54: } 55: 56: /* 57: 输入:数组A,待排序数组的大小aLen 58: 功能:堆排序 59: */ 60: void HeapSort(int A[], int aLen) 61: { 62: int hLen = aLen; 63: int temp; 64: 65: BuildHeap(A, hLen); //建堆 66: 67: while (hLen > 1) 68: { 69: temp = A[hLen-1]; //交换堆的第一个元素和堆的最后一个元素 70: A[hLen-1] = A[0]; 71: A[0] = temp; 72: hLen--; //堆的大小减一 73: AdjustHeap(A, hLen, 0); //调堆 74: } 75: }
相关文章推荐
- 《常见算法和数据结构》优先队列(3)——堆排序
- 【数据结构】常用比较排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)
- 【数据结构】Java实现各类经典排序算法——桶排序、堆排序
- 【数据结构】找出N个数据中最大的前k个数据(利用堆排序)
- 夕拾-数据结构-选择&堆排序
- 【数据结构】找出N个数据中最大的前k个数据(利用堆排序)
- 数据结构中堆的建立,建小堆,以及堆排序
- 数据结构之堆排序
- 【数据结构和算法】排序算法之二:选择排序和堆排序
- 【数据结构练习】排序——堆排序和快排
- 浅谈算法和数据结构: 五 优先级队列与堆排序
- 【数据结构】排序算法:希尔、归并、快速、堆排序
- 数据结构之排序算法二:堆排序,快速排序,归并排序
- ACM入门(2)——数据结构——堆排序
- 数据结构之堆排序
- 数据结构-堆排序
- 数据结构:堆排序
- 一步一步复习数据结构和算法基础-堆排序
- 堆(数据结构)及堆排序
- 【算法与数据结构】图说堆排序