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

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

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. Media Queries详解
  2. Android判断当前系统时间是否在指定时间的范围内(免消息打扰)
  3. Car的旅行路线(codevs 1041)
  4. EBS多OU和多帐套客户化总结
  5. 第K顺序统计量
  6. 5 Common Interview Mistakes that Could Cost You Your Dream Job (and How to Avoid Them)--ref
  7. Android中解析XML的方法
  8. Autofac 之 基于 Castle DynamicProxy2 的 Interceptor 功能
  9. redhat6.4 配置centos6 yum替换
  10. Cloudera Manager 5.9 和 CDH 5.9 离线安装指南及个人采坑填坑记
  11. 转:创建WebTest插件
  12. HDU 6035---Colorful Tree(树形DP)
  13. [Luogu4230]连体病原体
  14. 复活广州.net俱乐部
  15. mysql服务器主从数据库同步配置
  16. CEBX格式的文档如何转换为PDF格式文档、DOCX文档?
  17. sql业务分割
  18. python 子进程 subpocess 的使用方法简单介绍
  19. python字符串的常用方法
  20. 【bzoj1565】 NOI2009—植物大战僵尸

热门文章

  1. java 学习笔记之 流、文件的操作
  2. curl 命令详解
  3. uptime 命令详解
  4. Yum database disk image is malformed
  5. tar --打包和压缩
  6. 2、转载一篇,浅析人脸检测之Haar分类器方法
  7. python如何进行内存管理
  8. php+中文分词scws+sphinx+mysql打造千万级数据全文搜索
  9. 细说MyEclipse调试
  10. 本地Git仓库同步到Bitbucket 远程Git仓库