Skip to content

Commit

Permalink
feat: method name specification
Browse files Browse the repository at this point in the history
  • Loading branch information
fiteen committed Dec 19, 2019
1 parent a3cc49b commit cfee2ae
Show file tree
Hide file tree
Showing 13 changed files with 263 additions and 292 deletions.
36 changes: 18 additions & 18 deletions BubbleSort/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,17 @@

#### C语言
```c
void bubble_sort(int arr[], int len) {
void bubble_sort(int arr[], int n) {
int i, j, tmp;
for (i = 0; i < len - 1; i++) {
for (j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
}
}
```
### 算法分析
Expand All @@ -39,19 +39,19 @@ void bubble_sort(int arr[], int len) {
我们可以用一个 `flag` 参数记录新一轮的排序中元素是否做过交换,如果没有,说明前面参与比较过的元素已经是正序,那就没必要再从头比较了。代码实现如下:
```c
void bubble_sort_quicker(int arr[], int len) {
void bubble_sort_quicker(int arr[], int n) {
int i, j, tmp, flag;
for (i = 0; i < len - 1; i++) {
for (i = 0; i < n - 1; i++) {
flag = 0;
for (j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 1;
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 1;
}
}
if (!flag) return;
}
}
}
```
45 changes: 22 additions & 23 deletions BubbleSort/bubble_sort.c
Original file line number Diff line number Diff line change
@@ -1,42 +1,41 @@
#include <stdio.h>

void BubbleSort(int arr[], int len) {
void bubble_sort(int arr[], int n) {
int i, j, tmp;
for (i = 0; i < len - 1; i++) {
for (j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
}
}

void BubbleSortQuicker(int arr[], int len) {
void bubble_sort_quicker(int arr[], int n) {
int i, j, tmp, flag;
for (i = 0; i < len - 1; i++) {
for (i = 0; i < n - 1; i++) {
flag = 0;
for (j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 1;
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 1;
}
}
if (!flag) return;
}
}
}


int main() {
int arr[] = { 7, 2, 5, 3, 8};
int len = sizeof(arr) / sizeof(*arr);
BubbleSort(arr, len);
// BubbleSortQuicker(arr, len);
int n = sizeof(arr) / sizeof(*arr);
bubble_sort(arr, n);
// bubble_sort_quicker(arr, n);
printf("Sort result:\n");
for (int i = 0; i < len; i++)
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
76 changes: 38 additions & 38 deletions HeapSort/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@

以升序为例,算法实现的思路为:

1. 建立一个 BuildHeap 函数,将数组 tree[0,...n-1] 建立成堆,n 表示数组长度。函数里需要维护的是所有节点的父节点,最后一个子节点下标为 n-1,那么它对应的父节点下标就是(n-1-1)/2。
1. 建立一个 build_heap 函数,将数组 tree[0,...n-1] 建立成堆,n 表示数组长度。函数里需要维护的是所有节点的父节点,最后一个子节点下标为 n-1,那么它对应的父节点下标就是(n-1-1)/2。
2. 构建完一次堆后,最大元素就会被存放在根节点 tree[0]。将 tree[0] 与最后一个元素交换,每一轮通过这种不断将最大元素后移的方式,来实现排序。
3. 而交换后新的根节点可能不满足堆的特点了,因此需要一个调整函数 Heapify 来对剩余的数组元素进行最大堆性质的维护。如果 tree[i] 表示其中的某个节点,那么 tree[2\*i+1] 是左孩子,tree[2\*i+2] 是右孩子,选出三者中的最大元素的下标,存放于 max 值中,若 max 不等于 i,则将最大元素交换到 i 下标的位置。但是,此时以 tree[max] 为根节点的子树可能不满足堆的性质,需要递归调用自身。
3. 而交换后新的根节点可能不满足堆的特点了,因此需要一个调整函数 heapify 来对剩余的数组元素进行最大堆性质的维护。如果 tree[i] 表示其中的某个节点,那么 tree[2\*i+1] 是左孩子,tree[2\*i+2] 是右孩子,选出三者中的最大元素的下标,存放于 max 值中,若 max 不等于 i,则将最大元素交换到 i 下标的位置。但是,此时以 tree[max] 为根节点的子树可能不满足堆的性质,需要递归调用自身。

### 动图演示

Expand All @@ -28,46 +28,46 @@
#### C语言

```c
void Heapify(int tree[], int n, int i) {
// n 表示序列长度,i 表示父节点下标
if (i >= n) return;
// 左侧子节点下标
int left = 2 * i + 1;
// 右侧子节点下标
int right = 2 * i + 2;
int max = i;
if (left < n && tree[left] > tree[max]){
max = left;
}
if (right < n && tree[right] > tree[max]){
max = right;
}
if (max != i) {
swap(tree, max, i);
Heapify(tree, n, max);
}
void heapify(int tree[], int n, int i) {
// n 表示序列长度,i 表示父节点下标
if (i >= n) return;
// 左侧子节点下标
int left = 2 * i + 1;
// 右侧子节点下标
int right = 2 * i + 2;
int max = i;
if (left < n && tree[left] > tree[max]){
max = left;
}
if (right < n && tree[right] > tree[max]){
max = right;
}
if (max != i) {
swap(tree, max, i);
heapify(tree, n, max);
}
}

void BuildHeap(int tree[], int n) {
// 树最后一个节点的下标
int last_node = n - 1;
// 最后一个节点对应的父节点下标
int parent = (last_node - 1) / 2;
int i;
for (i = parent; i >= 0; i--) {
Heapify(tree, n, i);
}
void build_heap(int tree[], int n) {
// 树最后一个节点的下标
int last_node = n - 1;
// 最后一个节点对应的父节点下标
int parent = (last_node - 1) / 2;
int i;
for (i = parent; i >= 0; i--) {
heapify(tree, n, i);
}
}

void HeapSort(int tree[], int n) {
BuildHeap(tree, n);
int i;
for (i = n - 1; i >= 0; i--) {
// 将堆顶元素与最后一个元素交换
swap(tree, i, 0);
// 调整成大顶堆
Heapify(tree, i, 0);
}
void heap_sort(int tree[], int n) {
build_heap(tree, n);
int i;
for (i = n - 1; i >= 0; i--) {
// 将堆顶元素与最后一个元素交换
swap(tree, i, 0);
// 调整成大顶堆
heapify(tree, i, 0);
}
}
```
Expand Down
80 changes: 40 additions & 40 deletions HeapSort/heap_sort.c
Original file line number Diff line number Diff line change
@@ -1,57 +1,57 @@
#include <stdio.h>

void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}

void Heapify(int tree[], int n, int i) {
// n 表示序列长度,i 表示父节点下标
if (i >= n) return;
// 左侧子节点下标
int left = 2 * i + 1;
// 右侧子节点下标
int right = 2 * i + 2;
int max = i;
if (left < n && tree[left] > tree[max]){
max = left;
}
if (right < n && tree[right] > tree[max]){
max = right;
}
if (max != i) {
swap(tree, max, i);
Heapify(tree, n, max);
}
void heapify(int tree[], int n, int i) {
// n 表示序列长度,i 表示父节点下标
if (i >= n) return;
// 左侧子节点下标
int left = 2 * i + 1;
// 右侧子节点下标
int right = 2 * i + 2;
int max = i;
if (left < n && tree[left] > tree[max]){
max = left;
}
if (right < n && tree[right] > tree[max]){
max = right;
}
if (max != i) {
swap(tree, max, i);
heapify(tree, n, max);
}
}

void BuildHeap(int tree[], int n) {
// 树最后一个节点的下标
int last_node = n - 1;
// 最后一个节点对应的父节点下标
int parent = (last_node - 1) / 2;
int i;
for (i = parent; i >= 0; i--) {
Heapify(tree, n, i);
}
void build_heap(int tree[], int n) {
// 树最后一个节点的下标
int last_node = n - 1;
// 最后一个节点对应的父节点下标
int parent = (last_node - 1) / 2;
int i;
for (i = parent; i >= 0; i--) {
heapify(tree, n, i);
}
}

void HeapSort(int tree[], int n) {
BuildHeap(tree, n);
int i;
for (i = n - 1; i >= 0; i--) {
// 将堆顶元素与最后一个元素交换
swap(tree, i, 0);
// 调整成大顶堆
Heapify(tree, i, 0);
}
void heap_sort(int tree[], int n) {
build_heap(tree, n);
int i;
for (i = n - 1; i >= 0; i--) {
// 将堆顶元素与最后一个元素交换
swap(tree, i, 0);
// 调整成大顶堆
heapify(tree, i, 0);
}
}

int main() {
int arr[] = {5, 2, 7, 3, 6, 1, 4};
int n = sizeof(arr) / sizeof(*arr);
HeapSort(arr, n);
heap_sort(arr, n);
printf("Sort result:\n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
Expand Down
31 changes: 0 additions & 31 deletions InsertionSort/README.md

This file was deleted.

Loading

0 comments on commit cfee2ae

Please sign in to comment.