排序法里比较出名的,具体的算法看下图:

这篇博客说的通俗易懂:http://blog.csdn.net/morewindows/article/details/6684558

这是快速排序的基础,用代码实现如下:

void DiviedSort(int* arr_p,int start,int end)
{
int left,right,i=;
int pivot,result;
bool flag;
flag = TRUE;
pivot = arr_p[start];
right = end;
left = start;
#if DEBUG
printf("pivot:%d\r\n",pivot);
printf("L: ");
for(i=;i<end+;i++){
if(i==)
printf("_ ");
else
printf("%d ",arr_p[i]);
}
printf("\r\n");
#endif
while(left<right && flag){
while(arr_p[right]>=pivot){
right--;
if(right<=left){ //右边没有找到小于pivot的数 退出总循环
arr_p[left] = pivot; //将pivot保存到左边的坑里
flag = FALSE;
break;
}
}
if(flag){
//找到小于pivot的数移动到left
arr_p[left] = arr_p[right];
arr_p[right] = ;
left++;
if(left>=right){
flag = FALSE;
arr_p[right] = pivot;//当left右移等于right说明正好结束;
}
}else{
#if DEBUG
printf("Lf: ");
for(i=;i<end+;i++){
if(arr_p[i]==)
printf("_ ");
else
printf("%d ",arr_p[i]);
}
printf("\r\n");
#endif
break;
}
#if DEBUG
printf("R: ");
for(i=;i<end+;i++){
if(arr_p[i]==)
printf("_ ");
else
printf("%d ",arr_p[i]);
}
printf("\r\n");
#endif
while(arr_p[left]<=pivot){
left++;
if(left>=right){//左边没有找到大于pivot的数退出总循环
arr_p[right] = pivot;//保存pivot到右边的坑里
flag = FALSE;
break;
}
}
if(flag){
//找到大于pivot的数移动到right
arr_p[right] = arr_p[left];
arr_p[left] = ;
right--;
if(right<=left){
flag = FALSE;
arr_p[left] = pivot;//当right左移等于left说明正好结束
}
}else{
#if DEBUG
printf("Rf: ");
for(i=;i<end+;i++){
if(arr_p[i]==)
printf("_ ");
else
printf("%d ",arr_p[i]);
}
printf("\r\n");
#endif
break;
}
#if DEBUG
printf("L: ");
for(i=;i<end+;i++){
if(arr_p[i]==)
printf("_ ");
else
printf("%d ",arr_p[i]);
}
printf("\r\n");
#endif
}
}

运行结果是:

这个例子比较特殊。一轮就得出结果了,但是实际上要对pivot左右两边都分别递归调用这个算法,才能得到从小到大的顺序。

这里递归判断的条件是:

Left<Right

左边下标大于或者等于右边下标的时候说明数字已经按照从小到大排列。

下面是快速排序的完整代码。

//快速排序
//left:数组的起始位
//right:数组的结束位置,注意不是数组的最大容量
void QuickSort(int * arr,int left,int right)
{
int pivotNum = ;
int start,end;
if(left<right){
start = left,end = right;
pivotNum = arr[start];
while(start<end){
//从右边找一个小于pivotNum的数
while(start<end && arr[end]>=pivotNum){
end--;//右边的游标左移
}
if(start<end){
arr[start++] = arr[end];
}
//从左边找一个大于pivotNum的数
while(start<end && arr[start]<=pivotNum){
start++;//左边的游标右移
}
if(start<end){
arr[end--] = arr[start];
}
}
arr[start] = pivotNum;//这里在得出按照pivotNum比较得出顺序之后,要把中间数保存到最后游标停下的位置
QuickSort(arr,left,start-);
QuickSort(arr,start+,right);
}
}

验证代码:

int main(int argc, char *argv[]) {
int i=;
int arr[] = {,,,,,,,,,,};
QuickSort(arr,,);
for(i=;i<;i++){
printf("%d ",arr[i]);
}
printf("\r\n");
system("pause");
return ;
}

运行结果:

最后对于pivotNum中间值的选择可以随机选择也可以去中间值。

快速排序的效率问题:

如果每次确定的中值都是最小或者最大,那么时间复杂度是O(N^2);

最好的情况是中值正好是中间值,那么时间复杂度是O(nlgN);

总结:就平均效率而言,快速排序是基于关键之比较的速度最快的,平均效率是O(nlgN);

快速排序,C语言实现的更多相关文章

  1. 快速排序_C语言_数组

    快速排序_C语言_数组 #include <stdio.h> void quickSort(int *, int, int); int searchPos(int *, int, int) ...

  2. 快速排序 - C语言

    看了这本<数据结构与算法分析>中的快速排序. 写下自己理解后的代码,以备后用. #include "stdio.h" void insertSort(int arr[] ...

  3. [数据结构] 快速排序C语言程序

    //由大到小//快速排序(待排序数组,左侧起点,右侧起点) void quickSort(int *array, int l, int r) { if ( l >= r) return; int ...

  4. 快速排序 C语言实现

    转载于> http://blog.chinaunix.net/uid-26404477-id-3329885.html 总的关键字比较次数:O(nlgn) 尽管快速排序的最坏时间为O(n2),但 ...

  5. 快速排序c语言实现

    #include <stdio.h> void quick_sort(int* a, int n) { ) return; int i,j,tmp,k; k = a[n/]; ,j = n ...

  6. P1177【模板】快速排序(JAVA语言)

    import java.util.Scanner; import java.util.ArrayList; import java.util.Collections; import java.util ...

  7. 快速排序C语言版图文详解

    ​ 算法原理:选一个数位基准,将序列分成两个部分,一边全是比它小序列,另一边全是比它大序列.然后再分别对比他小的序列和比再次进行基准分割.依次分割下去,得到一个有序的队列. 原理图示: ​编辑 ​编辑 ...

  8. C语言排序

    排序算法 快速排序 C语言快速排序qsort(数组,长度,元素大小,cmp函数(*,*))//注意函数cmp的参数为指针 #include <stdio.h> #include <s ...

  9. PHP-----数组和常见排序算法

    数组的创建 <?php //php创建数组 //第一种方法 $arr[0]=1; $arr[1]=23; $arr[2]=20; $arr[3]=43; for($i=0;$i<count ...

  10. Neo4j 3.5发布,在索引方面大幅增强

    Neo4j 3.5版本已正式发布,这也是Neo4j宣布企业版闭源以来发布的第一个版本. 这个版本在性能.资源使用率以及安全方面均有增强,我们可以先快速浏览一下这个版本: 全文索引 基于Index的快速 ...

随机推荐

  1. nodejs 初入

    nodejs 模块路径 1.内置模块 如果传递给require函数的是NodeJS内置模块名称,不做路径解析,直接返回内部模块的导出对象,例:require('http'). 2. nodejs  支 ...

  2. MySql超新手入门

    https://www.kancloud.cn/thinkphp/mysql-tutorial/36457

  3. open-falcon 安装

    openfalcon 规划 拓扑图 transfer 配置文件 [root@openfalcon_transfer1 transfer]# cat cfg.json { "debug&quo ...

  4. MVC_表单和HTML辅助方法

    表单的使用 action特性告知Web浏览器信息发往哪里. method特性告知浏览器使用HTTP POST 还是 HTTP GET. GET请求用于读操作, POST请求用于写操作 HTML辅助方法 ...

  5. 一些常见maven仓库

    <repositories> <repository> <id>spring-releases</id> <url>https://repo ...

  6. windows环境同时连多个openvpn配置

    根据同事的经验分享:   环境: os:windows7 vpn: openvpn5   1. 进入"设备管理器" 2. 选择"操作" —> " ...

  7. DuiLib事件分析(一)——鼠标事件响应

    最近在处理DuiLib中自定义列表行元素事件,因为处理方案得不到较好的效果,于是只好一层一层的去剥离DuiLib事件是怎么来的,看能否在某一层截取消息,自己重写. 我这里使用CListContaine ...

  8. AndroidStudio2.0开发环境搭建

    实验内容 下载安装Android Studio 配置使用环境 实验要求 下载安装Android Studio 基本环境配置 实验步骤 1.首先从安卓开发者网站下载最新的Android Studio h ...

  9. oracle rac重建控制文件

    1.使用sqlplus连接到已经mount或open的rac数据库 sql> alter database backup controlfile to trace noresetlogs; 2. ...

  10. Struts2自定义类型转换,和处理类型转换错误

    Struts2自定义类型转换: 从前台接受到的类型全部是字符串,Struts2自带的一些基本类型转换有时不能满足我们的特别需要,如:日期字符串输入格式,还有一些自定义的类,直接传到后台,我们需要一些自 ...