【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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. 苹果8怎么投屏到电视_苹果电脑电视不在一个房间可以投屏
  2. 【Android】ViewPager实现无限循环滚动
  3. 理财工具——七大标准比率
  4. linux 压缩 解压zip 命令
  5. 无法检测或故障_电热水壶故障检修分析。
  6. python作业网站_python大作业
  7. 标志位鼠标Java_检查标志位java
  8. Android Splash闪屏页秒开 Activity白屏、Activity黑屏问题
  9. 阿里云DDoS高防 - 访问与攻击日志实时分析(三)
  10. 学习C/C++:伴随我成长的编程书!
  11. 数组求和forEach方法
  12. 一部影响美国网络安全政策的电影
  13. 【服务器数据恢复】服务器raid5磁盘阵列分区丢失的数据恢复案例
  14. 限时免费!Python自学资料包免费领,再不收藏就晚了
  15. 报错vs2019 初始值设定项值太多
  16. 抖音网页直播弹幕 protobuf 推导
  17. 游戏服务器内三类线程池的划分与使用
  18. 在一台电脑上如何安装两个JDK,并实现自由切换
  19. 【coolshell】开源中最好的Web开发的资源
  20. table合并单元格

热门文章

  1. 如何保护网页按钮不被XSS自动点击
  2. javaweb男的gulp入手实践
  3. 线程的同步与互斥,死锁
  4. nginx rtmp HLS直播
  5. JasperReport学习笔记6-JRXML的标签
  6. iphone iPhone开发中为UINavigationBar设置背景图片方法
  7. 上传文件到某文件夹时,提示...路径访问被拒绝
  8. iterm2 agnoster主题设置中的一些踩坑 2018.8
  9. mysql中使用case when语句
  10. redis安装、配置和启动