选择排序常见的包括简单选择排序和堆排序。对于堆排序,包括两个核心操作:
**【1】**大根堆/小根堆的构建。主要涉及到完全二叉树的顺序存储结构表示和相关性质理解,以及堆构建过程中的元素位置调整。
**【2】**堆排序过程中,删除堆顶元素,并用堆底元素进行补位,接着对剩余的堆中元素进行位置调整。(对于顺序存储结构表示的堆,可以通过下标限制在逻辑上对已输出元素进行“删除”)
=>更具体的原理就不在此进行赘述了。
1 大根堆的构建与堆中元素位置调整
这里仅以大根堆构建为例,给出堆构建过程的图解,这也是堆排序算法的核心所在。
2 堆排序算法的代码实现
/**
* 堆排序算法实现
* @param ints
* @param len
*/
public static void HeapSort(int[] ints,int len){
int i,temp;
ints=BuildMaxHeap(ints,len);
for (i=len;i>1;i--){
System.out.println(ints[1]);
temp=ints[1];
ints[1]=ints[i];
ints[i]=temp;
ints=HeapAdjust(ints,1,i-1);
}
}
/**
* 建立大根堆
*/
private static int[] BuildMaxHeap(int[] ints,int len){
int i;
for (i=len/2;i>0;i--)
ints=HeapAdjust(ints,i,len);
return ints;
}
/**
* 调整子堆
* @param ints
* @param k
* @param len
*/
private static int[] HeapAdjust(int[] ints, int k, int len) {
ints[0]=ints[k];//记录子堆根元素
for (int i=k*2;i<=len;i*=2){
if (i<len&&ints[i]<ints[i+1])
i++;
if (ints[0]>=ints[i]) break;
else {
ints[k]=ints[i];
k=i;
}
}//for
ints[k]=ints[0];
return ints;
}
3 堆排序代码测试
public static void main(String[] args) {
//2-堆排序
int[] ints={-1,49,38,65,97,76,13,27,49};
System.out.println(ints.length-1);
HeapSort(ints,ints.length-1);
}
最近时间比较紧,后面闲下来之后,可能会将数据结构的线性结构(线性表、栈、队列、串等)和非线性结构(树/图及其应用,普里姆算法、克鲁斯卡尔、Dijkstra算法等)、查找和排序算法等所有内容再进行丰富。