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

这篇博客说的通俗易懂: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. yii2.0 网址重写

  2. iOS:给Git仓库上传代码时,超过100M会被拒绝(例如github和oschina)

    处理GitHub不允许上传大于100M文件问题?本人也遇到这个坑... 来自转载,原文链接:http://www.cnblogs.com/qmmq/p/4604862.html 1.报错: 自己的项目 ...

  3. SVD奇异值分解

    奇异值分解 备忘:Eigen类库可能会和其他库产生冲突,将Eigen类库的头文件引用放到前面解决了.

  4. Django 一对多,多对多关系解析

    [转]Django 一对多,多对多关系解析   Django 的 ORM 有多种关系:一对一,多对一,多对多. 各自定义的方式为 :        一对一: OneToOneField         ...

  5. MVC强类型视图、强类型HTML辅助方法

    强类型视图: <table> <tr> <td>ID:</td><td><%: Model.Id %></td> & ...

  6. AMQP

    AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.基于此协议的客户端 ...

  7. FingerGestures 屏蔽NGUI的方法

    在Google搜到的帖子中提到的方法 有一个地方是错误的(折腾了好久 哎) http://www.tasharen.com/forum/index.php?topic=127.0 Camera NGU ...

  8. hduoj 3459 Rubik 2×2×2

    http://acm.hdu.edu.cn/showproblem.php?pid=3459 Rubik 2×2×2 Time Limit: 10000/5000 MS (Java/Others)   ...

  9. Ubuntu 安装BCM 43142无线网卡驱动

    ubuntu14.04 安装 bcm43142无线网卡 用命令lspci 查看无线网卡类型 然后下载对应的无线网卡驱动. 之后,使用下列命令安装,即可搜索无线热点了: sudo apt-get ins ...

  10. 【final】站立会议---11.27

    名称:nice! 组长:李权 成员:于淼  刘芳芳韩媛媛 宫丽君 时间:11月27日 13:00 项目内容:约跑app(约吧) 地点:传媒西楼220室 内容: 新任务的分配 1.李权分配任务 2.韩媛 ...