首先可以看到堆建好之后堆中第0个数据是堆中最大的数据。取出这个数据再执行下堆的删除操作。这样堆中第0个数据又是堆中最大的数据,重复上述步骤直至堆中只有一个数据时就直接取出这个数据。 由于堆也是用数组模拟的,故堆化数组后,第一次将A[0]与A[n - 1]交换,再对A[0…n-2]重新恢复堆。第二次将A[0]与A[n – 2]交换,再对A[0…n - 3]重新恢复堆,重复这样的操作直到A[0]与A[1]交换。由于每次都是将最大的数据并入到后面的有序区间,故操作完成后整个数组就有序了。
堆排序的图解过程如下:
堆排序的时间复杂度是O(nlogn)。堆排序和选择排序的元素比较次数与元素的初始排列无关。
其他排序算法的理解可以查看如下地址的以舞蹈方式教学的视频:
选择排序:http://v.youku.com/v_show/id_XMjU4NTY5NTcy.html
冒泡排序:http://v.youku.com/v_show/id_XMjU4MTg3MTU2.html
插入排序:http://v.youku.com/v_show/id_XMjU4NTY5MzEy.html
希尔排序:http://v.youku.com/v_show/id_XMjU4NTcwMDIw.html
归并排序:http://v.youku.com/v_show/id_XMzMyODk5Njg4.html
快速排序:http://v.youku.com/v_show/id_XMzMyODk4NTQ4.html
其中冒泡排序、插入排序、归并排序是稳定排序。插入排序和归并排序是节俭排序。
冒泡排序和快速排序属于交换排序。