Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 85828fa

Browse files
committed
heap sort
1 parent 6652ed4 commit 85828fa

File tree

2 files changed

+134
-95
lines changed

2 files changed

+134
-95
lines changed
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package grey.algorithm.code11_heap;
2+
3+
import java.io.*;
4+
import java.util.Arrays;
5+
6+
// 笔记:https://www.cnblogs.com/greyzeng/p/16933830.html
7+
// 1. 先让整个数组都变成大根堆结构,建立堆的过程:
8+
// a. 从上到下的方法,时间复杂度为O(N*logN)
9+
// b. 从下到上的方法,时间复杂度为O(N)
10+
// 2. 把堆的最大值和堆末尾的值交换, 然后减少堆的大小之后,再去调整堆, 一直周而复始,时间复杂度为O(N*logN) 【扩两倍估算复杂度法】
11+
// 3. 把堆的大小减小成0之后,排序完成
12+
// 堆排序额外空间复杂度O(1)
13+
// 测评:https://www.lintcode.com/problem/464
14+
//测评链接:https://www.luogu.com.cn/problem/P1177
15+
public class Code_0003_HeapSort {
16+
17+
public static void heapSort1(int[] arr) {
18+
int n = arr.length;
19+
// O(N*logN)
20+
for (int i = 0; i < n; i++) {
21+
heapInsert(arr, i);
22+
}
23+
// 注意:这里要保存一个变量,因为n在循环里面会变化
24+
int size = n;
25+
while (size > 0) {
26+
heapify(arr, 0, size);
27+
swap(arr, 0, --size);
28+
}
29+
}
30+
31+
public static void heapSort2(int[] arr) {
32+
int n = arr.length;
33+
// O(N)
34+
for (int i = n - 1; i >= 0; i--) {
35+
heapify(arr, i, n);
36+
}
37+
// 注意:这里要保存一个变量,因为n在循环里面会变化
38+
int size = n;
39+
while (size > 0) {
40+
heapify(arr, 0, size);
41+
swap(arr, 0, --size);
42+
}
43+
}
44+
45+
public static void heapInsert(int[] arr, int i) {
46+
while (arr[i] > arr[(i - 1) / 2]) {
47+
swap(arr, i, (i - 1) / 2);
48+
i = (i - 1) / 2;
49+
}
50+
}
51+
52+
public static void heapify(int[] arr, int i, int size) {
53+
int l = 2 * i + 1;
54+
while (l < size) {
55+
int best = l + 1 < size && arr[l + 1] > arr[l] ? l + 1 : l;
56+
best = arr[i] > arr[best] ? i : best;
57+
if (best == i) {
58+
break;
59+
}
60+
swap(arr, best, i);
61+
i = best;
62+
l = 2 * i + 1;
63+
}
64+
}
65+
66+
public static void swap(int[] arr, int i, int j) {
67+
int temp = arr[i];
68+
arr[i] = arr[j];
69+
arr[j] = temp;
70+
}
71+
72+
public static void main(String[] args) {
73+
74+
// 数组长度1~500,等概率随机
75+
int num = 500;
76+
// 每个值的大小在1~1024,等概率随机
77+
int value = 1024;
78+
// 测试次数
79+
int testTimes = 50000;
80+
System.out.println("测试开始");
81+
for (int i = 0; i < testTimes; i++) {
82+
int[] arr = generateArray(num, value);
83+
int[] copyArray = copyArray(arr);
84+
int[] copyArray2 = copyArray(arr);
85+
Arrays.sort(arr);
86+
heapSort1(copyArray);
87+
heapSort2(copyArray2);
88+
if (!sameValue(arr, copyArray)) {
89+
System.out.println("出错了!");
90+
break;
91+
}
92+
if (!sameValue(arr, copyArray2)) {
93+
System.out.println("出错了!");
94+
break;
95+
}
96+
}
97+
System.out.println("测试结束");
98+
}
99+
100+
private static boolean sameValue(int[] arr1, int[] arr2) {
101+
if (null == arr1) {
102+
return null != arr2;
103+
}
104+
if (null == arr2) {
105+
return null != arr1;
106+
}
107+
if (arr1.length != arr2.length) {
108+
return false;
109+
}
110+
for (int i = 0; i < arr1.length; i++) {
111+
if (arr1[i] != arr2[i]) {
112+
return false;
113+
}
114+
}
115+
return true;
116+
}
117+
118+
private static int[] generateArray(int num, int value) {
119+
int[] arr = new int[(int) (Math.random() * num) + 1];
120+
for (int i = 0; i < arr.length; i++) {
121+
arr[i] = (int) (Math.random() * value) + 1;
122+
}
123+
return arr;
124+
}
125+
126+
private static int[] copyArray(int[] arr) {
127+
int[] copyArray = new int[arr.length];
128+
for (int i = 0; i < copyArray.length; i++) {
129+
copyArray[i] = arr[i];
130+
}
131+
return copyArray;
132+
}
133+
134+
}

‎src/main/java/grey/algorithm/code11_heap/Code_0003_Luogu_P1177_HeapSort.java

Lines changed: 0 additions & 95 deletions
This file was deleted.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /