【Sort】HeapSort

  堆排序,时间复杂度O(N log N),实际使用中慢于使用Sedgewick增量的增量排序。

  大致思路:

  1.先在数组中建堆,如果是增量排序,则需要建一个大堆

  2.每循环一次,把最大的数,也就是nums[0],放入堆尾,同时把nums[0]下滤

 1 void heapsort(int *nums,int n)
 2 {
 3     int i;
 4     for(i=n/2;i>=0;i--)
 5         percdown(nums,i,n);
 6     for(i=n-1;i>0;i--)
 7     {
 8         nums[0]^=nums[i];
 9         nums[i]^=nums[0];
10         nums[0]^=nums[i];
11         percdown(nums,0,i);
12     }
13 }
14 void percdown(int *nums,int p,int n)
15 {
16     int tmp;
17     int child;
18     for(tmp=nums[p];2*p+1<n;p=child)
19     {
20         child=2*p+1;
21         if(2*p+2!=n&&nums[2*p+2]>nums[child])
22             child++;
23         if(nums[child]>tmp)
24             nums[p]=nums[child];
25             else
26                 break;
27     }
28     nums[p]=tmp;
29
30 }
时间: 2024-10-16 14:37:08

【Sort】HeapSort的相关文章

【Sort】多种排序

这篇文章包含了插入排序,希尔排序,堆排序,归并排序和快速排序,是前几篇文章的集合. 一共包括三个文件 sort.h sort.cpp main.cpp 1.main.cpp 1 #include <iostream> 2 #include "sort.h" 3 using namespace std; 4 5 int main() 6 { 7 \\test code 8 return 0; 9 } 2.sort.h 1 #ifndef SORT_H_ 2 #define S

UVA10474_Where is the Marble?【sort】【lower_bound】

Where is the Marble? Raju and Meena love to play with Marbles. They have got a lot of marbles with numbers written on them. At the beginning, Raju would place the marbles one after another in ascending order of the numbers written on them. Then Meena

【sort】 基数排序

下面这段问答摘自csdn: 把基数排序说成桶排序应该是没有太大问题的.总的说来,应该把这一类归为分配排序,由于分配排序的一些缺陷,主要是时间代价很差,改进成为桶式排序(bucket sort),而桶排序的基本思路是将较少的纪录分配到每个桶,然后用较快的“收尾排序”来对每桶中的纪录进行排序.在此基础上,当允许基于分配排序的收尾排序时,为了尽量减少桶的数量并缩短排序时间,发展出了基数排序(Radix Sort).基数的选择:如果是数字,最常用的是2和10这两个了,当然是由于二进制和十进制的关系,就如

【Sort】QuickSort

快速排序,平均运行时间O(N log N),最坏运行时间O(N^2). 我觉得先看Python版的快排算法(http://www.cnblogs.com/fcyworld/p/6160558.html)比较容易理解. 整体思路: 首先从数组中选出一个值pivot,然后依据这个值pivot,把数组分成大小两部分,然后再分别对这两部 分利用快排. 具体细节: 1.在具体的实现中,因为pivot的选择会对数组的划分产生很大的影响,若划分的不均衡,则极大的影响 排序时间.为了尽可能消除这种影响,同时取数

【Sort】Merge Sort归并排序

归并排序运行时间O(N log N),但是由于需要线性附加内存,所以很少用于主存排序. 算法核心在于以下三条语句,分治递归,分别对左半边和右半边的属组进行排序,然后把左右半边的属组一一进行比较放入数组 1 msort(nums,tmp,lp,center); 2 msort(nums,tmp,center+1,rp); 3 merge(nums,tmp,lp,center+1,rp); 下面是代码,主要包括三个函数: 1 void mergesort(int *nums,int n) 2 { 3

【Sort】RadixSort基数排序

太晚了,明天有时间在写算法思路,先贴代码 1 #include <iostream> 2 3 using std::cout; 4 5 void radixsort(int *a,int num); 6 int loop(int *a,int num); 7 int main() 8 { 9 int a[10]={3,2,1,4,7,6,5,8,9,0}; 10 radixsort(a,10); 11 for(int i=0;i<10;i++) 12 cout<<a[i]&l

【LeetCode】Sort Colors

LeetCode OJ Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, w

【LeetCode】Sort Colors 解题报告

[题目] Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, white, a

【HackerRank】 The Full Counting Sort

In this challenge you need to print the data that accompanies each integer in a list. In addition, if two strings have the same integers, you need to print the strings in their original order. Hence, your sorting algorithm should be stable, i.e. the