/*堆排 给的数据和以前的最小堆有所不同, 这次是A[0]中没有哨兵 所以父亲结点与左儿子结点的关系是 child = parent*2 + 1 */ void Heap_Sort(ElementType A[],int N) { int i; /*??????这里为什么i=N/2-1也是对的呢?????????*/ for(i=(N-1)/2;i>=0;i--)/*调整为最大堆*/ PercDown(A,i,N); for(i=N-1;i>0;i--){ Swap(A,A+i); /*A[0](最大值) 与A[i](最小值)*/ PercDown(A,0,i);/*将A[0]为根,有i个元素的的堆,调为最大堆,*/ } }
void Heapsort( ElementType A[ ], int N ) { int i; /* 1*/ for( i = N / 2; i >= 0; i-- ) /* BuildHeap */ /* 2*/ PercDown( A, i, N ); /* 3*/ for( i = N - 1; i > 0; i-- ) { /* 4*/ Swap( &A[ 0 ], &A[ i ] ); /* DeleteMax */ /* 5*/ PercDown( A, 0, i ); } }
void HeapSort( ElementType A[], int N ) { int i; for( i = N / 2; i >= 0; i-- ) { PercDown( A, i, N ); } for( i = N - 1; i > 0; i-- ) { Swap( &A[ 0 ], &A[ i ] ); PercDown( A, 0, i ); } }
void HeapSort(ElementType A[], int N) { int i; /* build heap */ for (i = N/2; i >= 0; i--) { PercDown(A, i, N); } /* delete max */ for (i = N - 1; i > 0; i--) { Swap(&A[0], &A[i]); PercDown(A, 0, i); } }
void HeapSort(ElementTyp A[], int N) { int i; for(i = N/2 ; i >= 0; i--) { // 通过下滤建堆 PercDown(A, i, N); } for(i = N - 1; i > 0; i--) { // 通过下滤删除最大元素 Swap(&A[0], &A[i]); PercDown(A, 0, i); printf("%d ", A[i]); // 降序打印数组中元素 } }
void heapsort(ElementType A[], int N) { Resource_logSpace(SPACE_ELEMENT_INT); int i; //1 for (i = N / 2; i >= 0; i--) { /* BuildHeap *///3 Resource_logTime(3); PercDown(A, i, N); } for (i = N - 1; i > 0; i--) { //3 Resource_logTime(3); Swap(&A[0], &A[i]); /* DeleteMax */ PercDown(A, 0, i); } Resource_logTime(3); Resource_logSpace(SPACE_ELEMENT_INT); }
void BuildHeap( MaxHeap H ) { /* 调整H->Data[]中的元素,使满足最大堆的有序性 */ /* 这里假设所有H->Size个元素已经存在H->Data[]中 */ int i; /* 从最后一个结点的父节点开始,到根结点1 */ for( i = H->Size/2; i>0; i-- ) PercDown( H, i ); }
void Heapsort( ElementType A[ ], int N ) { int i; PrintArr ( A, N ) ; printf ( "Bulid Heap\n" ); /* 1*/ for( i = N / 2; i >= 0; i-- ) { /* BuildHeap */ printf ( "PercDown %d\n", A[i] ) ; /* 2*/ PercDown( A, i, N ); PrintArr ( A, N ) ; } PrintArr ( A, N ) ; printf ( "Sort Operation\n" ) ; /* 3*/ for( i = N - 1; i > 0; i-- ) { /* 4*/ Swap( &A[ 0 ], &A[ i ] ); /* DeleteMax */ printf ( "After swap( %d, %d )\n", A[ 0 ], A[ i ] ) ; PrintArr ( A, N ) ; printf ( "PercDown %d\n", A[0] ) ; /* 5*/ PercDown( A, 0, i ); PrintArr ( A, N ) ; } }