【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

快速排序是编程中经常使用到的一种排序方法。可是很多朋友对快速排序有畏难情绪,认为快速排序使用到了递归,是一种非常复杂的程序,其实未必如此。只要我们使用好了方法,就可以自己实现快速排序。

首先,我们复习一下,快速排序的基本步骤是什么:

1、 判断输入参数的合法性

2、把数组的第一个数据作为比较的原点,比该数据小的数据排列在左边,比该数据大的数据排列在右边

3、按照(2)的方法分别对左边的数组和右边的数据进行和(2)一样的数据排列

那么实际编写代码中,应该怎么做呢?

a)首先,判断数据的合法性?

void quick_sort(int array[], int length)
{int median = 0;if(NULL == array || 0 == length)return;_quick_sort(array, 0, length -1);
}

b)寻找中间数,分别对左边和右边的数据进行排序

void _quick_sort(int array[], int start, int end)
{int middle;if(start >= end)return;middle = get_middle(array, start, end);_quick_sort(array, start, middle -1);_quick_sort(array, middle + 1, end);
}void quick_sort(int array[], int length)
{int median = 0;if(NULL == array || 0 == length)return;_quick_sort(array, 0, length-1);
}

c)那么这里的中间数应该怎么安排呢?

int get_middle(int array[], int start, int end)
{int front = 0;int tail = end - start;int value = array[start];int length = end - start + 1;int loop = start + 1;while(loop <= end){if(array[loop] < value){gQuickSort[front] = array[loop];front ++;}else{gQuickSort[tail] = array[loop];tail --;}loop ++;}gQuickSort[front] = value;memmove(&array[start], gQuickSort, sizeof(int) * (length));return start + front ;
}

注意:这里gQuickSort是一个全局数组,主要是为了作为排序的临时数组使用,实际环境中大家可以灵活运用各种方法。

 d)基本的快速排序就完成了,那我们怎么测试呢?我们可以编写几个简单的测试用例?

static void test1()
{int array[] = {1};quick_sort(array, sizeof(array)/sizeof(int));
}static void test2()
{int array[] = {2, 1};quick_sort(array, sizeof(array)/sizeof(int));assert(1 == array[0]);assert(2 == array[1]);
}static void test3()
{int array[] = {4, 3, 2,1};quick_sort(array, sizeof(array)/sizeof(int));assert(1 == array[0]);assert(2 == array[1]);assert(3 == array[2]);assert(4 == array[3]);
}static void test4()
{int array[] = {3, 2, 1};quick_sort(array, sizeof(array)/sizeof(int));assert(1 == array[0]);assert(2 == array[1]);assert(3 == array[2]);
}

【预告: 下一篇博客主要介绍合并排序的内容】

一步一步写算法(之快速排序)相关推荐

  1. 人人都来写算法 之 快速排序

    中午吃饭比较早,利用20分钟把快速排序写了下,以说明算法为主,采用int数组存储数据.后续可以在以下两点优化程序: 1. 采用模板编程,支持通用数据类型: 2. 采用函数指针或者函数对象决定排序方式. ...

  2. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  3. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  4. 一步一步写算法(之寻找丢失的数)

    一步一步写算法(之寻找丢失的数) 原文:一步一步写算法(之寻找丢失的数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 假设我们有一个1亿个 ...

  5. 一步一步写算法(之克鲁斯卡尔算法 中)

    一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到 ...

  6. 一步一步写算法(之prim算法 下)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...

  7. 一步一步写算法(开篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多 ...

  8. 编程题C语言写牛牛数星星,一步一步写算法(之“数星星”)

    原文: 一步一步写算法(之"数星星") [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习 ...

  9. 一步一步写算法(之排序二叉树删除-1)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每 ...

  10. 一步一步写算法(之排序二叉树删除-3)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 3 普通节点的删除 3.1 删除的节点没有左子树,也没有右子树 测试用例1: 删除节点6 /* ...

最新文章

  1. (用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正...
  2. C语言入门经典——基础知识(指针 数组 多维数组)
  3. Kettle调用Java类
  4. JavaScript入门(part8)--数组
  5. 今日头条上传图片时设置封面图报像素低的原因是什么
  6. aes密文长度_RSA加密密文可变(一句话说明)
  7. django-多对多关系
  8. Ubuntu启动显示System program problem detected 原因及解决方法
  9. 《KyLin学习理解》-01-KyLin麒麟的简介及其思想
  10. Matrix(二维树状数组)入门第一题
  11. linux基础命令介绍十三:启动流程
  12. Druid Monitor监控JavaSE,杀cmd端口进程
  13. xml 标签带有号php,php截取字符串并保留完整xml标签的函数代码
  14. 2020最新Java高级工程师学习路线
  15. 项目管理软件 OpenProj
  16. 通达信完全加密指标破解 通达信完全加密公式源码提取 tni tne tn6还原源文件
  17. ansi编码_刨根究底字符编码之零——前言
  18. 我用二手书,在这里换了一大箱好书
  19. 微信开挂怎么防止封号_再也不怕被封号!微信养号秘笈教你防封号防降权
  20. 关于微信公众号文章编辑器不能直接编辑html样式的处理方法

热门文章

  1. 我国云计算还处于初步阶段,产业标准需规划
  2. 进程调度主要函数解析
  3. JFrame 跳转之后自动关闭窗口 dispose()
  4. virus test
  5. [Usaco2006 Open]County Fair Events 参加节日庆祝
  6. Linux rmmod命令
  7. Non-standard serial port baud rate setting
  8. 将指定内容写入目标文件(日志)
  9. 发短信的简单实现——C#版
  10. Extjs GridPanel 监听事件 行选中背景