堆排序的数组实现,由于数组的下标可能从1开始,也可能从0开始,所以要注意,以下代码分两种情况考虑
1.当数组下标从0开始的时候
public class HeapSort {
static void adjustHeap1(int[] dataList ,int key, int n){//假设数组下标从0开始的情况建堆
<span style="white-space:pre"> </span>int keyWord = dataList[key];
<span style="white-space:pre"> </span>for (int i = 2*key+1; i < n; i=i*2+1) {
if((i+1) < n && dataList[i]<dataList[i+1]){
i++;
}
if(dataList[i]>keyWord){
dataList[key] = dataList[i];
key=i;
}else{
break;
}
dataList[key] = keyWord;
}
print1(dataList);
}
static void print1(int[] dataList){//打印数组
for (int j = 0; j < dataList.length; j++) {
System.out.print(dataList[j]+" ");
}
System.out.println();
}
public static void main(String[] args) {
int[] dataList = {0,13,65,97,76,38,27,49,10};
int size = dataList.length,temp;//数组下标从0开始,建立初始堆
System.out.println("开始建立初始堆");</span>
for (int i = size/2-1; i >= 0; i--) {
System.out.println("i="+i);
adjustHeap1(dataList, i, size);
}
System.out.println("调整堆位置");
for (int i = size-1; i >0; i--) {
temp=dataList[i];
dataList[i] = dataList[0];
dataList[0] = temp;
adjustHeap1(dataList, 0, i-1);
}
}
}
2.当数组下标从1开始的时候
</pre><pre code_snippet_id="1616856" snippet_file_name="blog_20160320_7_5106729" name="code" class="plain">public class HeapSort {
static void adjustHeap(int[] dataList ,int key, int n){//假设数组下标从1开始
int keyWord = dataList[key];
for (int i = 2*key; i < n; i*=2) {
if(i < n && dataList[i]<dataList[i+1]){
i++;
}
if(dataList[i]>keyWord){
dataList[key] = dataList[i];
key=i;
}else{
break;
}
dataList[key] = keyWord;
}
print(dataList);
}
static void print(int[] dataList){
for (int j = 1; j < dataList.length; j++) {
System.out.print(dataList[j]+" ");
}
System.out.println();
}
public static void main(String[] args) {
int[] dataList = {0,13,65,97,76,38,27,49,10};//0位置只是占位符
int size = dataList.length-1,temp;//数组下标从1开始
System.out.println("开始建立初始堆");
for (int i = size/2; i > 0; i--) {
adjustHeap(dataList, i, size);
}
System.out.println("调整堆位置");
for (int i = 0; i < size-2; i++) {
temp = dataList[size-i];
dataList[size-i] = dataList[1];
dataList[1] = temp;
adjustHeap(dataList, 1, size-i-1);
}
}
}
堆排序和希尔排序有个共同的地方,就是会以待插入元素的关键字,往下找到适合的位置,就是从关键字所在位置开始往下(其子孙节点)找到最适合位置,如果关键字比某个子孙节点所在的位置元素还小,就要把相对应的子孙节点位置与关键字所在位置进行交换,交换后子孙节点所在的位置即为关键字所在位置,依次继续往子孙节点中找,直至关键字所在位置的值比其孩子节点的值都大或关键字已到叶子节点为止。