选择排序 的基础知识:
1.选择排序(Selection sort)是一种简单直观的排序算法。
2.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。
3.选择排序是不稳定的排序方法
堆排序 的基础知识:
1.堆排序存储结构的是树,且是完全二叉树
2.分为两个阶段:首先将一个数据序列建成堆,根节点是最大值(最小值);然后采用选择排序思路,每趟将根节点交换到后面,再将其余值调整成堆,依次重复,直到排序完成。
下面是树的调整图例:
1.这是一个无序的树,开始对每个结点进行调整
2.这是对某一结点与其子节点的交换过程
3.从叶节点开始,每一次都是这样调整
5.这是调整一部分之后的图示:
6.逐级往上调整
7.按照上述过程,即可调整成功
而堆排序的每一次过程,都是 调整+选择 ,所以剩下的只是重复过程
下面是堆排序的算法实现代码:
package practice;
import java.util.*;
public class heapSort {
static int[] table = {5,4,3,7,8,9,1,6};
//将以begin为根的子树调整成最小堆,begin、begin是序列的下界和上界
public static void sift(int[] table, int begin, int end) {
int i = begin, j = 2 * i + 1; //i为子树的根,j为i结点的左孩子
int temp = table[i]; //获取第i个元素的值
while(j <= end) {
if(j < end && table[j] > table[j+1]) //数组元素比较
j++; //j为左右孩子最小者
if(temp > table[j]) {
table[i] = table[j];
i = j;
j = 2 * i + 1;
}
else break;
}
table[i] = temp; //当前子树的原根调整后的位置;
}
//堆排序
public static void heapSort(int[] table) {
int n = table.length;
for(int j = n/2 - 1; j >= 0; j--) { //创建最小堆
sift(table,j,n-1);
}
for(int j = n - 1; j > 0; j--) { //每趟将最小值交换到后面,再调整成堆
int temp = table[0];
table[0] = table[j];
table[j] = temp;
sift(table, 0, j-1);
}
}
//主函数测试
public static void main(String[] args) {
heapSort(table);
for(int i = 0; i < table.length; i++) {
System.out.print(table[i] + "\t");
}
}
}
下面是代码测试结果:
堆排序算法分析:
1.将一个序列调整为堆的时间复杂度为O(log2(n)),因此堆排序的时间复杂度为O(n*log2(n))。
2.堆排序的空间复杂度为O(1)。因为只有一个外部引用量。
3.堆排序算法属于不稳定算法(即相等数据位置可能不同)。