小小的注意点们

  • 交换两个变量的值时, 如果使用异或运算符, 需要先判断两个数是否相等
  1. if (a == b) return;
  2. a ^= b;
  3. b = a ^ b;
  4. 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


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define ARRAY_PRINT(arr, length) do { \
  5. for (int i = 0; i < length; i++) { \
  6. printf("%d\t", arr[i]); \
  7. } \
  8. } while (0)
  9. #define SWAP(a, b) do { \
  10. if (a == b) break; \
  11. (a) ^= (b); \
  12. (b) = (a) ^ (b); \
  13. (a) ^= (b); \
  14. } while (0)
  15. #define MID(low, high) ((low + high) / 2)
  16. static void quick_sort_recurision(int *a, int low, int high) {
  17. int pivot, i, j;
  18. pivot = low; // select a pivot element
  19. i = low;
  20. j = high;
  21. if (high - low) return;
  22. while (i <= j) {
  23. if (a[i] <= a[pivot] && i <= high) {
  24. i++;
  25. }
  26. else if (a[j] > a[pivot] && j >= low) {
  27. j--;
  28. }
  29. else {
  30. SWAP(a[i], a[j]);
  31. }
  32. }
  33. SWAP(a[j], a[pivot]);
  34. quick_sort_recurision(a, low, j - 1);
  35. quick_sort_recurision(a, j + 1, high);
  36. }
  37. void quick_sort(int *arr, int len) {
  38. if (!arr || len < 0) return;
  39. int low = 0, high = len - 1;
  40. quick_sort_recurision(arr, low, high);
  41. }
  42. #define LENGTH 10
  43. int main() {
  44. srand((int) time(0));
  45. int arr[LENGTH];
  46. for (int i = 0; i < LENGTH; i++) {
  47. arr[i] = rand() % 60;
  48. }
  49. ARRAY_PRINT(arr, LENGTH);
  50. quick_sort(arr, LENGTH);
  51. putchar(10);
  52. ARRAY_PRINT(arr, LENGTH);
  53. return 0;
  54. }

随机推荐

  1. MVC下为什么要使用Areas

    想研究一下这个Areas,在博客园知识库找到这篇文章,先全部搬过来吧,原文地址:http://kb.cnblogs.com/page/144561/ 为什么需要分离? 我们知道MVC项目各部分职责比较 ...

  2. shell脚本实现自动保留最近n次备份记录

    项目中出现的问题 某天上午服务器出现卡顿特别严重,页面加载速度奇慢,并且某些页面刷新出现404的问题,就连服务器的tab命令的自动提示都出现了问题,楼主费了九牛二虎之力,根据服务器排查发现,服务器数据 ...

  3. WeChat 微信公众号开发步骤

    WeChat  微信公众号开发步骤 一.什么是微信公众号? 微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字.图片.语音 ...

  4. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

  5. epoll简介

    1.epoll简介 epoll是I/O事件通知工具,与select/poll相比,epoll最大的好处在于它不会随着监听fd数目的增长而效率降低.epoll API既可以用作edge触发的接口,也可以 ...

  6. 【Python】python对象与json相互转换

    转自:http://blog.csdn.net/leilba/article/details/50654256 # -*- coding: UTF-8 -*- import json #自定义类 cl ...

  7. CI框架源码学习笔记4——Benchmark.php

    我们回到Codeigniter.php上继续往下看,第一个引入的类文件是Benchmark.php,这个文件主要是提供基准测试,具体使用方法参考手册http://codeigniter.org.cn/ ...

  8. Python脚本开发练习

    打印乘法口诀表 #!/usr/bin/python #coding=utf-8 print("Hello,World....") print("你好,欢迎来到Python ...

  9. luogu2155 [SDOI2008]沙拉公主的困惑

    link 求出1到N的阶乘中与M的阶乘互质的数的个数,对R取模,多组询问,R<=10^9+10,T<=10000,1 < = N , M < = 10000000 1到\(M! ...

  10. filter防止xxs攻击

    什么是XSS攻击? XSS攻击使用Javascript脚本注入进行攻击 例如在表单中注入: <script>location.href='http://www.itmayiedu.com' ...