堆排序
堆排序
1 // 将待排序的最后一个元素current插入大根堆中 2 void insert_heap(int *arr, int current, int low, int high) 3 { 4 //记录low的孩子结点中较大元素的下标,初始化为左孩子 5 int large = 2*low + 1; 6 while(large <= high) 7 { 8 //右孩子较大 9 if(large < high && arr[large] < arr[large+1]) 10 large++; 11 //当前元素大于所有孩子 12 if(current >= arr[large]) 13 break; 14 else//当前元素小于左右孩子中较大的一个 15 { 16 arr[low] = arr[large]; 17 low = large; 18 large = 2*low + 1; 19 } 20 } 21 //将目标元素插入合适的位置 22 arr[low] = current; 23 } 24 25 //建堆 26 void build_heap(int *arr, int n) 27 { 28 int low, current; 29 //从最后一个非叶结点开始 30 for(low = n/2 - 1; low >= 0; low--) 31 { 32 current = arr[low]; 33 insert_heap(arr,current,low,n-1); 34 } 35 } 36 37 //堆排序,从后往前,每次将堆头最大的元素放到堆尾,同时将堆尾元素插入到堆中 38 void hearSort(int *arr, int n) 39 { 40 int current;//暂存待插入的元素 41 int last_unsorted;//未排序的最后一个元素 42 build_heap(arr,n);//建堆 43 44 for(last_unsorted = n-1; last_unsorted > 0; last_unsorted--) 45 { 46 current = arr[last_unsorted];//暂存堆尾元素 47 arr[last_unsorted] = arr[0];//堆头元素放在堆尾 48 insert_heap(arr,current,0,last_unsorted-1);//未排序的堆尾元素插入堆 49 } 50 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。