小小的注意点们

  • 交换两个变量的值时, 如果使用异或运算符, 需要先判断两个数是否相等
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;
}

随机推荐

  1. 消息队列开发记录笔记-ActiveMQ

    1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip,然后双击a ...

  2. jzoj4916. 【GDOI2017模拟12.9】完全背包问题 (背包+最短路)

    题面 题解 考场上蠢了--这么简单的东西都想不到-- 首先排序加去重. 先来考虑一下,形如 \[a_1x_1+a_2x_2+...a_nx_n=w,a_1<a_2<...<a_n,x ...

  3. Python第一次写的代码

    #!/bin/bash/env python # -*- coding:utf-8 -*- #function:输出1-10每隔1秒 import time start = 1 flag = True ...

  4. Sublime Text3安装、配置及常用插件(陆续补全中~)

    一.安装Sublime Text3 网址:http://www.sublimetext.com/3 注册码:(sublime Text3汉化和激活注册码) ----- BEGIN LICENSE -- ...

  5. 洛谷 P2141 珠心算测验

    嗯... 先看一下这个题.... 题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及. 某学校的 ...

  6. Java实现微信小程序支付(准备)

    Java语言开发微信小程序支付功能: 1.通过https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1路径到官方下载Java的支付SD ...

  7. 8. sql 片段

    sql 片段: <sql id="columnBase"> `id`, `title`, `author_id` as authorId, `state`, `feat ...

  8. 【Cracking the Code Interview(5th edition)】二、链表(C++)

    链表结点类型定义: class Node { public: ; Node *next = nullptr; Node(int d) { data = d; } }; 快行指针(runner)技巧: ...

  9. mysql 配置utf8 编码,支持 emoji 方法!!!

    utf8_general_ci 已经 过时了...请以后用mysql 考虑使用 utf8mb4, utf8mb4_unicode_ci!!! 兼容性更好. mysql的utf8编码的一个字符最多3个字 ...

  10. C# repeater控件序号绑定

    做项目列表经常会需要列表有一个序号列,根据控件自身的属性就可以很方便的实现这个功能,如下图 这个不能用翻页功能,如果翻页重新刷新控件的话,序号会又重新开始!