借用堆对一个数组进行排序
首先创建一个堆,如果是升序创建(大堆)反之则相反
大堆创建后初始化,将数组元素插入到堆中来构成堆
对堆中的堆顶元素进行删除
第一次删除过后,最大的堆顶元素存在堆的数组的最后一个位置
第二次删除后,次大的堆顶元素存放在堆的数组的倒数第二个位置
....待堆中的所有元素删除完之后,存放堆的数组元素排好由小到大
最后将存放堆的数组元素依次赋值给已知的数组
163 //根据一个堆对数组进行排序 如果升序(大堆),降序(小堆)
164
165 void HeapSort(HeapType arr[], size_t size, int sort_flag)
166 {
167 if(arr==NULL||size==0)
168 {
169 //非法输入
170 return ;
171 }
172 //创建一个堆,进行初始化
173 Heap heap;
174 if(soft_flag==1)
175 {
176 HeapInit(&heap, Greater);
177 }
178 else
179 {
180 HeapInit(&heap,Less);
181 }
182
183 //根据数组元素对堆进行插入来创建堆
184 size_t cur=0;
185 for(;cur<size;cur++)
186 {
187 HeapInsert(&heap,arr[cur]);
188 }
189
190 //依次删除堆顶元素
191 for(cur=0;cur<size;++cur)
192 {
193 HeapErase(&heap);
194 }
195 memcpy(arr,heap.data,size*sizeof(HeapType));
196 }