算法-堆排序与快速排序

堆排序

  • 堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。堆排序很适合在m个数中选择最大的k个数的问题。只需要进行k此调整就可以取出。

  • 思路:

    • 首先需要构成一个大顶堆。
    • 将堆首元素出堆,将堆尾元素放在堆首,然后对剩下的m-1个数进行成堆。
  • Java实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package sort;
import java.util.Arrays;
/**
* Created by cdx0312
* 2018/3/28
*/
public class HeapSort {
public static void main(String[] args) {
int[] arr = {53, 23, 45, 86, 12, 33, 10, 90, 36, 70, 43, 88, 60, 29};
System.out.println("排序之前: " + Arrays.toString(arr));
heapSort(arr);
System.out.println("排序之后: " + Arrays.toString(arr));
}
/**
* 堆排序方法
* @param arr 待排序的数组
*/
private static void heapSort(int[] arr) {
//1、创建大根堆,从第一个非叶子节点向堆首元素进行交换
for (int i = arr.length / 2; i >= 0; i--) {
heapAdjust(arr, i, arr.length);
}
//最后一个节点与root节点交换,然后调整成大根堆,
for (int i = arr.length - 1; i > 0; i--) {
swap(arr, 0, i);
heapAdjust(arr, 0, i);
}
}
/**
* 构建堆的过程
* @param arr 需要排列的数组
* @param i 需要构建堆的根节点的序号
* @param length 堆元素的个数,随着出堆不断的减少
*/
private static void heapAdjust(int[] arr, int i, int length) {
int child;
for (int fathre = arr[i]; leftChild(i) < length; i = child) {
child = leftChild(i);
//选择节点i的较大的孩子节点
if (child != length - 1 && arr[child] < arr[child+1]) {
child++;
}
//如果父节点的值小于其较大的孩子节点,则交换二者的值
if (fathre < arr[child]) {
swap(arr, i, child);
} else {
break;
}
}
}
private static void swap(int[] arr, int i, int j) {
int tmp =arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
private static int leftChild(int i) {
return 2 * i+ 1;
}
}

快速排序

快速排序一般基于递归实现:

  • 选定一个合适的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package sort;
import java.util.Arrays;
/**
* Created by cdx0312
* 2018/3/28
*/
public class QuickSort {
public static void main(String[] args) {
int[] arr = {53, 23, 45, 86, 12, 33, 10, 90, 36, 70, 43, 88, 60, 29};
System.out.println("排序之前: " + Arrays.toString(arr));
quickSort(arr);
System.out.println("排序之后: " + Arrays.toString(arr));
}
public static void quickSort(int[] arr) {
quickSortHelp(arr, 0, arr.length - 1);
}
private static void quickSortHelp(int[] arr, int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);
quickSortHelp(arr, low, pivot - 1);
quickSortHelp(arr, pivot + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[low];
while (low < high) {
while (low < high && arr[high] >= pivot)
high--;
arr[low] = arr[high];
while (low < high && arr[low] <= pivot)
low++;
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}
private static void swap(int[] arr, int low, int high) {
int temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
}
}
Donate comment here