堆排序算法(参考More Window的代码)

来源:互联网 发布:js数组转换json字符串 编辑:程序博客网 时间:2024/05/21 10:08

先写代码,说明随后补上。

 

// HeapSort.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"//较大堆元素下移void HeapBigDown(int arr[], int i, int n){int temp = arr[i];int j = i * 2 + 1;while(j < n){if(j + 1 < n && arr[j+1] < arr[j])//先找到较小元素的索引号{j++;}if(arr[j] >= temp)break;arr[i] = arr[j];i = j;j = i * 2 + 1;}arr[i] = temp;}void HeapSmallDown(int arr[], int i, int n){int temp = arr[i];int j = i * 2 + 1;while(j < n){if(j + 1 < n && arr[j] < arr[j+1])//获取较大子节点的索引{j++;}if(arr[j] < temp)//较大的子节点比父节点还小,则退出break;arr[i] = arr[j];i = j;j = i * 2 + 1;}arr[i] = temp;}//建立堆结构void CreateHeap(int arr[], int n){for(int i = (n - 1)/2; i >= 0; --i){//n为元素总个数HeapBigDown(arr, i, n);}}void CreateBigHeap(int arr[], int n){for(int i = (n-1)/2; i >= 0; --i){HeapSmallDown(arr, i, n);}}void Print(int arr[], int n){for(int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");}void swap(int &n1, int &n2){int temp = n1;n1 = n2;n2 = temp;}void Sort(int arr[], int n){for(int i = n - 1; i >= 0; --i){swap(arr[0], arr[i]);//第一个元素为最小值HeapBigDown(arr, 0, i);//此时i代表元素总个数,在HeapBigDown不会处理arr[i]这个元素}}void SortAscend(int arr[], int n){for(int i = n-1; i >= 0; i--){swap(arr[0], arr[i]);HeapSmallDown(arr, 0, i);}}int _tmain(int argc, _TCHAR* argv[]){int arr[] = {9, 12, 17, 30, 50, 20, 60, 65, 4, 49};CreateBigHeap(arr, 10);//建立大根堆Print(arr, 10);SortAscend(arr, 10);Print(arr, 10);//CreateHeap(arr, 10);//建立小根堆//Print(arr, 10);//Sort(arr, 10);//Print(arr, 10);getchar();return 0;}


0 0
原创粉丝点击