【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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. plsql 参数中in out in的区别讲解
  2. 云计算的下半场:云原生
  3. ios取两个数之间的随机小数_如果取到小数区间内的任一数字?
  4. react招聘项目——使用cookie实现项目自动登录功能
  5. sql 触发器_一键生成某个sql的html--记录执行计划、统计信息、触发器等
  6. java 实现 常见排序算法(四)基数排序
  7. 正则只能小于0负数_2019–2020学年七年级数学期末考试考点之正数与负数考点详解...
  8. android Handler更新UI
  9. maya mel uf8_如何在maya中创建uv 的mel语言
  10. Linux hypervisor VMM介绍
  11. linux下日志文件的查找(tail和grep)
  12. 一幅图看懂prototype与[[Prototype]]
  13. stn专线和otn有什么区别_专线网络和家庭宽带有什么区别?
  14. 2021-07-07 分类页面结构
  15. 六大免费网站数据采集器对比(火车头,海纳,云采集,ET,三人行,狂人采集)
  16. php gd 缩小,php 使用GD缩小图片,使用透明格式就失真
  17. 【滤波器】最小均方(LMS)自适应滤波器
  18. SPA单页面首屏加载慢怎么解决???
  19. IrisSkin 皮肤
  20. 基于风光储能和需求响应的微电网日前经济调度(Python代码实现)【0】

热门文章

  1. 03-树3 Tree Traversals Again
  2. Python一课一练(网站项目做单元测试)
  3. ExtJs之ExtJs.Model验证
  4. StateListDrawable 动态更换背景
  5. iPad不完美?盖茨的酸葡萄心理
  6. SpringBoot集成ActiveMq消息队列实现即时和延迟处理
  7. 深度解读最流行的优化算法:梯度下降
  8. csdn 不登录浏览全文 chrome 浏览器
  9. python-同步(互斥)锁、递归锁、同步条件(event)
  10. 『诡异的』VL10B创建外向交货单出错解决全过程