算法练习二 堆排序
2011-04-20 08:53
183 查看
// HeapSort.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<stdlib.h> #include<time.h> using namespace std; #define random(x) (rand()%x) #define LEFT(i) ( i << 1) #define RIGHT(i) ( ( i << 1 ) + 1 ) #define PARENT(i) ( i >> 1 ) /* 数组下标统一从1开始,第0位置不使用。 如果数组有10个元素从Ary[0] - Ary[9] 那么aryLen = 9 只使用 Ary[1] - Ary[9] */ void HeapSort(int ary[]); void BuildMaxHeap(int ary[]); void MaxHeapify(int ary[], int i); int AryLen = 0; int HeapSize = 0; int _tmain(int argc, _TCHAR* argv[]) { int num = 10; cout << "请输入需要排序数组的长度,数组将随机生成:" <<endl; cin >> num; int* arry = new int[num+1]; srand( (int)time(0) ); for ( int x=1; x<num+1; x++ ) { arry[x] = random(10000); cout << arry[x] << endl; } AryLen = num; HeapSort( arry ); // cout << endl << "after sort " << endl; for( int i=1; i<num+1; i++ ) { cout << arry[i] << "/t"; } delete[] arry; system("pause"); return 0; } void HeapSort(int ary[]) { BuildMaxHeap( ary ); cout << "after BuildMaxHeap" << endl; int j=0; for ( j=1; j<=AryLen; j++) { cout << ary[j] << "/t"; } HeapSize = AryLen; int i = AryLen; for( ; i>=2; i--) { int temp = ary[1]; ary[1] = ary[i]; ary[i] = temp; HeapSize = HeapSize - 1; MaxHeapify(ary,1); } } /* 构造最大堆 子数组Ary[ (arylen >> 1 + 1)....arylen ] 中的元素都是树中的叶子,因此每个都可看作是只含一个元素的堆。 过程BuildMaxHeap对树中的每一个其他结点都调用一次MaxHeapify. */ void BuildMaxHeap(int ary[]) { int i = AryLen; i = i >> 1; HeapSize = AryLen; for ( ; i>=1; i--) { MaxHeapify( ary, i ); } } /* 保持最大堆性质 @i: 数组下标从1开始 */ void MaxHeapify( int ary[], int i) { int left = LEFT( i ); int right = RIGHT( i ); int largest = 0; if ( left <= HeapSize && ary[left] > ary[i] ) { largest = left; } else { largest = i; } if ( right <= HeapSize && ary[right] > ary[largest] ) { largest = right; } if ( largest != i ) { //cout << "ary[" <<i<< "]=" << ary[i] << "ary["<<largest<<"]=" <<ary[largest] << "/t"; int temp = ary[i]; ary[i] = ary[largest]; ary[largest] = temp; MaxHeapify( ary, largest); } }
相关文章推荐
- 【练习】数据结构与算法练习题之高效排序
- 图解算法练习--选择排序(Go实现)
- Hark的数据结构与算法练习之基数排序
- 算法练习:两指针之三色排序
- [算法练习]逆置链表,链表排序,删除节点
- 剑指offer-算法题练习:part13 数字字母重排序-笔试题
- [算法练习]选择排序的C语言实现
- 剑指offer-算法题练习:part18 合并两个排序的链表
- 2018年全国多校算法寒假训练营练习比赛(第三场)-H-向左走(极角排序)
- #旧代码# 基本算法练习:常见排序/KMP字符串查找/链表反转
- 算法练习:两指针之三色排序
- 【算法练习】数组排序
- 2018年全国多校算法寒假训练营练习比赛(第三场)H 向左走【极角排序】
- 算法笔记_100:蓝桥杯练习 算法提高 三个整数的排序(Java)
- 算法练习——排序后的数组删除重复数字
- [算法练习]插入排序的C语言实现
- 【算法练习】二叉树方法对数组进行排序
- 算法练习 - 排序
- 图解算法练习--选择排序(PHP实现)
- 算法-蓝桥杯-基础练习 数列排序(JAVA)