etc

小小的注意点们

  • 交换两个变量的值时, 如果使用异或运算符, 需要先判断两个数是否相等
if (a == b) return;
a ^= b;
b = a ^ b;
a ^= b;
  • 取一个数组的中间位置, 应该使用(low + high) / 2, 不适用length / 2, 目的是方便之后可能出现的函数的递归等操作
  • 堆排序

    • 对一个整数类型的数组进行升序排序
      1. 原始数组即为一个二叉堆(左孩子的下标=父亲的下标 * 2 + 1, 右孩子的下标=父亲的下标 * 2 + 2, 孩子父亲的下标=(孩子的下标 - 1) / 2)
      2. 调整堆, 将堆转换为最大堆(判断if parent < two_children: swap(parent, larger_child))
      3. 删除原始堆中最后的一个元素(并不是真的删除, 而是该堆的length - 1), 对仍然保留在堆中的元素进行$2的操作
  • 快速排序
    • 递归成立的条件式low < high

Code here


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ARRAY_PRINT(arr, length) do {                \
for (int i = 0; i < length; i++) {                    \
printf("%d\t", arr[i]);                             \
}                                                     \
} while (0)

#define SWAP(a, b)    do {            \
if (a == b) break;            \
(a) ^= (b);                \
(b) = (a) ^ (b);            \
(a) ^= (b);                \
} while (0)

#define MID(low, high) ((low + high) / 2)

static void quick_sort_recurision(int *a, int low, int high) {
    int pivot, i, j;
    pivot = low; // select a pivot element
    i = low;
    j = high;
    if (high - low) return;
    while (i <= j) {
        if (a[i] <= a[pivot] && i <= high) {
            i++;
        }
        else if (a[j] > a[pivot] && j >= low) {
            j--;
        }
        else {
            SWAP(a[i], a[j]);
        }
    }
    SWAP(a[j], a[pivot]);
    quick_sort_recurision(a, low, j - 1);
    quick_sort_recurision(a, j + 1, high);
}

void quick_sort(int *arr, int len) {
    if (!arr || len < 0) return;
    int low = 0, high = len - 1;
    quick_sort_recurision(arr, low, high);
}

#define LENGTH 10

int main() {
    srand((int) time(0));
    int arr[LENGTH];
    for (int i = 0; i < LENGTH; i++) {
        arr[i] = rand() % 60;
    }
    ARRAY_PRINT(arr, LENGTH);
    quick_sort(arr, LENGTH);
    putchar(10);
    ARRAY_PRINT(arr, LENGTH);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/megachen/p/9555958.html
etc
今日推荐