常用算法(2)--选择排序&堆排序
来源:互联网 发布:java调用外部程序 编辑:程序博客网 时间:2024/05/22 12:22
- 从arr[0]~arr[N]中找出最小的值,放在arr[0],此时arr[0]已经排好序
- 从arr[1]~arr[N]中找出最小的值,放在arr[1],
- ....从arr[i]~arr[N]中找出最小的值,放在arr[i],
- 找到i==N,排序完成
二、堆排序
堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法。
伦理片 http://www.dotdy.com/
(2)、交换数据:将a[0]和a[n]交换,使a[n]是a[0...n]中的最大值;然后将a[0...n-1]重新调整为最大堆。 接着,将a[1]和a[n-1]交换,使a[n-1]是a[1...n-1]中的最大值;然后将a[1...n-2]重新调整为最大值。 依次类推,直到整个数列都是有序的。
(2)、索引为i的左孩子的索引是 (2*i+2);
(3)、索引为i的父结点的索引是 floor((i-1)/2);即取整
在堆排序算法中,首先要将待排序的数组转化成二叉堆。
下面演示将数组{20,30,90,40,70,110,60,10,100,50,80}转换为最大堆{110,100,90,40,80,20,60,10,30,50,70}的步骤。
1.1 i=数组长度/2-1=11/2-1,即i=4
上面是maxheap_down(a, 4, 10)调整过程。maxheap_down(a, 4, 10)的作用是将a[4...10]进行下调;a[4]的左孩子是a[9],右孩子是a[10]。调整时,选择左右孩子中较大的一个(即a[10])和a[4]交换。
1.2 i=3
上面是maxheap_down(a, 3, 10)调整过程。maxheap_down(a, 3, 10)的作用是将a[3...10]进行下调;a[3]的左孩子是a[7],右孩子是a[8]。调整时,选择左右孩子中较大的一个(即a[8])和a[4]交换。
1.3 i=2
上面是maxheap_down(a, 2, 10)调整过程。maxheap_down(a, 2, 10)的作用是将a[2...10]进行下调;a[2]的左孩子是a[5],右孩子是a[6]。调整时,选择左右孩子中较大的一个(即a[5])和a[2]交换。
1.4 i=1
上面是maxheap_down(a, 1, 10)调整过程。maxheap_down(a, 1, 10)的作用是将a[1...10]进行下调;a[1]的左孩子是a[3],右孩子是a[4]。调整时,选择左右孩子中较大的一个(即a[3])和a[1]交换。
交换之后,a[3]为30,它比它的右孩子a[8]要大,接着,再将它们交换。
1.5 i=0
上面是maxheap_down(a, 0, 10)调整过程。maxheap_down(a, 0, 10)的作用是将a[0...10]进行下调;a[0]的左孩子是a[1],右孩子是a[2]。调整时,选择左右孩子中较大的一个(即a[2])和a[0]交换。
交换之后,a[2]为20,它比它的左右孩子要大,选择较大的孩子(即左孩子)和a[2]交换。
调整完毕,就得到了最大堆。此时,数组{20,30,90,40,70,110,60,10,100,50,80}也就变成了{110,100,90,40,80,20,60,10,30,50,70}。
(2)、交换数据
影音先锋电影 http://www.iskdy.com/
在将数组转换成最大堆之后,接着要进行交换数据,从而使数组成为一个真正的有序数组。
交换数据部分相对比较简单,下面仅仅给出将最大值放在数组末尾的示意图。
上面是当n=10时,交换数据的示意图。
当n=10时,首先交换a[0]和a[10],使得a[10]是a[0...10]之间的最大值;然后,调整a[0...9]使它称为最大堆。交换之后:a[10]是有序的。
当n=9时, 首先交换a[0]和a[9],使得a[9]是a[0...9]之间的最大值;然后,调整a[0...8]使它称为最大堆。交换之后:a[9...10]是有序的。
...
依此类推,直到a[0...10]是有序的。
- 常用算法(2)--选择排序&堆排序
- 常用排序算法总结(三)----选择排序 堆排序
- 【Java常用排序算法】选择排序(简单选择排序、堆排序)
- 常用排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)
- 【数据结构】常用比较排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)
- 常用排序算法(2)-选择排序
- 堆排序算法(选择排序改进)
- 几种常用的排序算法(快速排序,希尔排序,堆排序,选择排序,冒泡排序)
- 算法分析-选择排序(直接选择排序 & 堆排序)
- 算法-排序-选择排序(直接选择和堆排序)
- 算法之选择排序(2)——堆排序
- 算法---选择-堆排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序算法2--简单选择排序、堆排序
- 排序算法2--简单选择排序、堆排序
- 排序算法2--简单选择排序、堆排序
- 排序算法2--简单选择排序、堆排序
- 排序算法2--简单选择排序、堆排序
- Ant之build.xml详解
- 进程和线程区别
- Unity3D 2D游戏开发 官方教程。(一)
- Apache Indexes FollowSymLinks详解
- C语言变长数组 struct中char data[0]的用法
- 常用算法(2)--选择排序&堆排序
- 四大组件---Activity的启动模式
- 连载《一个程序猿的生命周期》- 43.新公司这一年,我都发生了哪些变化。--- 年底干货总结!!!
- 安装Python第三方函数库方法
- 【Unity实用小方法】判断贴图是否为透明贴图
- ThreadLocal实现局部变量的多线程同步
- 内存查看器
- Servlet forward & include
- Linux shell 编程