快速排序【记录一下代码】

本文仅用作学习记录,大神勿喷O(∩_∩)O~

代码一、百度百科C++语言版本代码,参考数据结构p274(清华大学出版社,严蔚敏)

 1 void Qsort1(int a[], int low, int high)//百度百科C++语言版本代码 
 2 {/*参考数据结构p274(清华大学出版社,严蔚敏)*/
 3     if(low >= high) return;
 4     int first = low;
 5     int last = high;
 6     int key = a[first];/*用字表的第一个记录作为枢轴*/
 7  
 8     while(first < last)
 9     {
10         while(first < last && a[last] >= key)
11         {
12             --last;
13         }
14         a[first] = a[last];/*将比第一个小的移到低端*/
15         while(first < last && a[first] <= key)
16         {
17             ++first;
18         }
19         a[last] = a[first];    
20         /*将比第一个大的移到高端*/
21     }
22     a[first] = key;/*枢轴记录到位*/
23     Qsort1(a, low, first-1);
24     Qsort1(a, first+1, high);
25 }
View Code

代码二、百度百科C语言版本代码

 1 void Qsort2(int *a, int left, int right)//百度百科C语言版本代码 
 2 {
 3     if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
 4     {
 5         return ;
 6     }
 7     int i = left;
 8     int j = right;
 9     int key = a[left];
10      
11     while(i < j)                               /*控制在当组内寻找一遍*/
12     {
13         while(i < j && key <= a[j])/*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/ 
14         {
15             j--;/*向前寻找*/
16         }
17         a[i] = a[j];/*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是a[left],那么就是给key)*/
18          
19         while(i < j && key >= a[i])/*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
20         {
21             i++;
22         }
23         a[j] = a[i];
24     }
25      
26     a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/
27     Qsort2(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
28     Qsort2(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
29                        /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
30 }
View Code

代码三、坐在马桶上看算法:快速排序。   链接:http://developer.51cto.com/art/201403/430986.htm

(来源页面评论代码有误,测试没发现问题。)

 1 void Qsort3(int a[],int left,int right) //坐在马桶上看算法:快速排序。http://developer.51cto.com/art/201403/430986.htm 
 2 { 
 3     int i,j,t,temp; 
 4     if(left>right) return; 
 5                                 
 6     temp=a[left]; //temp中存的就是基准数 
 7     i=left; 
 8     j=right; 
 9     while(i!=j) 
10     { 
11         //顺序很重要,要先从右边开始找 
12         while(i<j && a[j]>=temp) 
13             j--; 
14         //再找右边的 
15         while(i<j && a[i]<=temp) 
16             i++; 
17         //交换两个数在数组中的位置 
18         if(i<j) 
19         { 
20             t=a[i]; a[i]=a[j]; a[j]=t; 
21         } 
22     } 
23     //最终将基准数归位 
24     a[left]=a[i]; 
25     a[i]=temp; 
26                              
27     Qsort3(a,left,i-1);//继续处理左边的,这里是一个递归的过程 
28     Qsort3(a,i+1,right);//继续处理右边的 ,这里是一个递归的过程 
29 }
View Code

代码四、白话经典算法系列之六 快速排序   链接: http://blog.csdn.net/morewindows/article/details/6684558#

链接页面评论一致认为作者讲解非常棒。

 1 void Qsort4(int s[], int l, int r)//白话经典算法系列之六 快速排序 http://blog.csdn.net/morewindows/article/details/6684558#
 2 {  
 3     if (l < r)  
 4     { 
 5         int i = l, j = r, x = s[l];
 6         while (i < j)
 7         {
 8             while(i < j && s[j] >= x) // 从右向左找第一个小于x的数  
 9                 j--;    
10             if(i < j)   
11                 s[i++] = s[j];  
12               
13             while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数  
14                 i++;    
15             if(i < j)   
16                 s[j--] = s[i];  
17         }
18         s[i] = x;  
19         Qsort4(s, l, i - 1); // 递归调用   
20         Qsort4(s, i + 1, r);  
21     }
22 }  
View Code

代码五、博客园~大器晚成~的代码  链接:http://www.cnblogs.com/luchen927/archive/2012/02/29/2368070.html

原文代码有误,评论里面已经有园友指出。这里摘抄时已经修改,否则当待排序列有相等值则可能会死循环 。

 1 void Qsort5(int *v, int left, int right)//博客园“大器晚成”的代码http://www.cnblogs.com/luchen927/archive/2012/02/29/2368070.html 
 2 {//原文代码有错误,已经修改,否则当待排序列有相等值则会死循环 。修改以后,本代码与百度百科代码是相同 
 3     if(left < right)
 4     {
 5         int key = v[left];
 6         int low = left;
 7         int high = right;
 8         while(low < high)
 9         {
10             while(low < high && v[high] >= key)//原文 while(low < high && v[high] > key)
11             {
12                 high--;
13             }
14             v[low] = v[high];
15             while(low < high && v[low] <= key)//原文while(low < high && v[low] < key)
16             {
17                 low++;
18             }
19             v[high] = v[low];
20         }
21         v[low] = key;
22         Qsort5(v,left,low-1);
23         Qsort5(v,low+1,right);
24     }
25 }
View Code

代码六、《C++一本通》page191快速排序代码(请阅读这一段代码)

 1 void Qsort6(int *a,int l,int r)//《C++一本通》page191快速排序代码 
 2 {  
 3     int i,j,mid,p;
 4     i=l;
 5     j=r; 
 6     mid=a[(l+r) / 2]; //将当前序列在中间位置的数定义为分隔数
 7     do
 8     {
 9         while (a[i]<mid) i++;//在左半部分寻找比中间数大的数
10         while (a[j]>mid) j--;//在右半部分寻找比中间数小的数
11         if (i<=j) 
12         { //若找到一组与排序目标不一致的数对则交换它们
13             p=a[i];a[i]=a[j];a[j]=p;
14             i++;j--; //继续找
15         }
16     }while(i<=j);//注意这里不能少等号
17     if (l<j)  Qsort6(a,l,j);//若未到两个数的边界,则递归搜索左右区间
18     if (i<r)  Qsort6(a,i,r);
19 }
View Code

代码七、来自北大郭炜老师在网易云课堂开设的算法课程

 1 #include <iostream>
 2 using namespace std;
 3 void swap(int & a,int & b) //交换变量a,b值
 4 {
 5     int tmp = a;
 6     a = b;
 7     b = tmp;
 8 }
 9 void QuickSort(int a[],int s,int e)
10 {
11     if( s >= e) return;
12     int k = a[s];
13     int i = s,j = e;
14     while( i != j ) 
15     {
16         while( j > i && a[j] >= k ) --j;
17         swap(a[i],a[j]);
18         while( i < j && a[i] <= k ) ++i;
19         swap(a[i],a[j]);
20     } //处理完后, a[i] = k
21     QuickSort(a,s,i-1);
22     QuickSort(a,i+1,e);
23 }
24 int a[] = { 93,27,30,2,8,12,2,8,30,89};
25 int main()
26 {
27     int size = sizeof(a)/sizeof(int);
28     QuickSort(a,0,size-1);
29     for(int i = 0;i < size; ++i)
30         cout << a[i] << ",";
31     cout << endl;
32     return 0;
33 }
View Code

 

 

注意:在快排过程中划分区间时,必须要有等号,比如:

1     int i=left,j=right,key=a[left];
2     while(i<j)
3     {
4         while(i<j&&key>=a[j]) j--;//必须取等号,否则当数组两头的数相等时会死循环 
5         a[i]=a[j];
6         while(i<j&&key<=a[i]) i++;//必须取等号,否则当数组两头的数相等时会死循环
7         a[j]=a[i];
8     }

这种地方>=不能改为>,否则可能死循环。

 

 

 

测试用的主函数

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 
 5 int cmp(const void *a,const void *b)
 6 {    return *(int*)a - *(int*)b;   }
 7 int main()
 8 {
 9     int a[50],b[50],c[50],d[50],e[50],f[50],g[50],h[50];
10     int n,i,k=100000,index=1,count=0;
11     srand((unsigned)time(0));
12     
13     freopen("res.out","w",stdout);
14     for(;k>0;k--)
15     {
16         n=(rand()%2==1?49:50);
17          for(i=0;i<n;i++)
18          {
19              a[i]=rand()%3000;
20              h[i]=g[i]=f[i]=e[i]=d[i]=c[i]=b[i]=a[i];
21         }
22         
23         Qsort1(a, 0, n - 1);
24         Qsort2(b, 0, n - 1);
25          qsort(c,n,sizeof(c[0]),cmp);
26          Qsort3(e,0,n-1);
27          Qsort4(f,0,n-1);
28          Qsort5(g,0,n-1);
29          Qsort6(h,0,n-1);
30          
31         for(i= 0; i < n; i++)
32         {
33             if(a[i]!=c[i]||b[i]!=c[i]||e[i]!=c[i]||f[i]!=c[i]||g[i]!=c[i]||h[i]!=c[i]) 
34                 break;
35         }
36         if(i<n)
37         {
38             printf("case %d:\n",index);
39             printf("A:");//Qsort1的结果 
40             for(i=0;i<n;i++)
41                 printf("%d ",a[i]);
42                printf("\n");
43                
44                printf("B:");//Qsort2的结果 
45             for(i=0;i<n;i++)
46                 printf("%d ",b[i]);
47                printf("\n");
48                
49                printf("C:");//标准结果序列 
50             for(i=0;i<n;i++)
51                 printf("%d ",c[i]);
52                printf("\n");
53                
54                printf("E:");//Qsort3的结果 
55             for(i=0;i<n;i++)
56                 printf("%d ",e[i]);
57                printf("\n");
58                
59                printf("F:");//Qsort4的结果 
60             for(i=0;i<n;i++)
61                 printf("%d ",f[i]);
62                printf("\n");
63                
64                printf("G:");//Qsort5的结果 
65             for(i=0;i<n;i++)
66                 printf("%d ",g[i]);
67                printf("\n");
68                
69                printf("H:");//Qsort6的结果 
70             for(i=0;i<n;i++)
71                 printf("%d ",h[i]);
72                printf("\n");
73                
74                printf("D:");//原未排序序列 
75             for(i=0;i<n;i++)
76                 printf("%d ",d[i]);
77                printf("\n");
78         }
79         else { printf("case %d is ok!\n",index); count++;}
80         index++;
81     }
82     printf("%d of %d is ok!\n",count,index-1);
83     return 0;
84 }
View Code

 

其实 Qsort1、Qsort2、Qsort5(博客园代码修改以后)三份代码是一样的
Qsort4跟上面几个是差不多的,但稍有一点点改变
Qsort3思路变化比较大一些。
Qsort6简直就是另类代码风格,瞎搞的,不过也是对的。
学习记住 Qsort1、Qsort2、Qsort5之一或者Qsort4即可。

经过在洛谷OJ  P1177 测试,代码六应该是最合理的,大家还是记住代码六吧。。。。。。

(利用库函数qsort在洛谷OJ  P1177提交确实也是AC的,然后利用代码六去提交也可以过。说明OJ的数据没问题。)

其余代码的分割点元素的选择都是选第一个元素,这个决策是一个不合理的决策,会导致算法的时间复杂度在某些情况下变为N^2级别的。虽然代码六不能够完全避免这个情况,但是相对而言比较合理一些。具体论述请参考《数据结构与算法分析:C语言描述(原书第2版)》对快速排序的描述。

 

转载于:https://www.cnblogs.com/huashanqingzhu/p/6591091.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse 修改java代码不重启服务器 生效配置

1.本文目的&#xff1a;用tomcat进行web开发时&#xff0c;修改Java代码往往要重启代码&#xff0c;当工程较大启动较慢时&#xff0c;严重影响效率&#xff0c;本文通过eclipse下tomcat开发和发布web程序时&#xff0c;对一些Java代码一般修改&#xff08;不是增减方法、变量&…

Shell第二篇:正则表达式和文本处理工具

一 什么是正则 正则就是用一些具有特殊含义的符号组合到一起&#xff08;称为正则表达式&#xff09;来描述字符或者字符串的方法。或者说&#xff1a;正则就是用来描述一类事物的规则。 生活中处处都是正则&#xff1a; 比如我们描述&#xff1a;4条腿 你可能会想到的是四条腿…

计算机二级办公软件高级应用难不难,计算机二级office难吗 考试内容是什么

相信很多的在校大学生或者已经开始工作的小伙伴都会有考虑过要考国二MsOffice高级应用考试&#xff0c;那么&#xff0c;计算机二级office难吗&#xff1f;考试内容是什么&#xff1f;计算机二级office难吗许多考生基础差&#xff0c;考生缺乏备考计划&#xff0c;超过70%的考生…

sed 解释正则表达式

以/etc/passwd文件为模板 1&#xff0c;删除文件每行的第一个字符。 2&#xff0c;删除文件每行的第二个字符。 3&#xff0c;删除文件每行的最后一个字符。 4&#xff0c;删除文件每行的倒数第二个字符。 5&#xff0c;删除文件每行的第二个单词。 转载于:https://www.cnblogs…

在windows下codeblocks中配置pthread库

转自&#xff1a;http://blog.csdn.net/u013172314/article/details/50846198 如果添加方法不正确&#xff0c;可能会出现pthread_create’未定义的引用&#xff0c;所以下面我讲一下正确的配置方法。 首先介绍一下我的安装平台和需要下载的工具包&#xff1a; win7 64位&#…

[Android-Appium]: 安卓自动化测试: 环境准备

安卓自动化测试&#xff1a;环境的准备&#xff1a; 在做安卓自动化测试之前&#xff0c;需要在你的电脑上做如下环境的准备&#xff0c; 我用的是 Appium做的自动化测试。 安装Appium server&#xff0c; 安装路径&#xff1a;http://appium.io/ https://bitbucket.org/app…

计算机考研8,计算机考研每日一练:第八天

平衡二叉树实现原理平衡二叉树构建的基本思想就是在构建二叉排序树的过程中&#xff0c;每当插入一个结点时&#xff0c;先检查是否因插入而破坏了树的平衡性&#xff0c;若是&#xff0c;则找出最小不平衡子树。在保持二叉排序树特性的前提下&#xff0c;调整最小不平衡子树中…

Python全栈开发:web框架们

Python的WEB框架 Bottle Bottle是一个快速、简洁、轻量级的基于WSIG的微型Web框架&#xff0c;此框架只由一个 .py 文件&#xff0c;除了Python的标准库外&#xff0c;其不依赖任何其他模块。 1234pip install bottleeasy_install bottleapt-get install python-bottlewget htt…

软件测试实验二

1.百度搜索seleniumIDE&#xff0c;进入官网http://www.seleniumhq.org/download/下载区下载软件 2.使用seleniumIDE录制脚本&#xff0c;打开IDE&#xff0c;录制脚本&#xff0c;并测试脚本 3.导出脚本&#xff0c;完成实验 转载于:https://www.cnblogs.com/wyp-run/p/661974…

计算机在管理会计应用中的作用,信息化在管理会计中的作用

信息化在管理会计中的作用在管理会计的日常工作中&#xff0c;需要进行大量的数据收集整理工作&#xff0c;会出现漏算错算等情况&#xff0c;加强管理会计软件的创新和研发&#xff0c;从而推进企业会计电算化。摘要:较比以往&#xff0c;信息技术不断发展&#xff0c;在人们的…

基于鸢尾花数据集的逻辑回归分类实践

基于鸢尾花数据集的逻辑回归分类实践 重要知识点 逻辑回归 原理简介&#xff1a; Logistic回归虽然名字里带“回归”&#xff0c;但是它实际上是一种分类方法&#xff0c;主要用于两分类问题&#xff08;即输出只有两种&#xff0c;分别代表两个类别&#xff09;&#xff0c…

校办研修之计算机培训简报,“2018校本研修培训”第二期学习简报

原标题&#xff1a;“2018校本研修培训”第二期学习简报校训校风&#xff1a;博教风学风&#xff1a;学习提升&#xff0c;共约成长洛阳市第二十六中学2018年校本研修培训学习简报(第二期)素材收集&#xff1a;数学组、物理组、生物组制 作&#xff1a;郭志伟、张志刚时 间&…

Python之路 day1 基础1 变量 for while 用户输入

一、 Python介绍 python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;。1989年的圣诞节期间&#xff0c;吉多范罗苏姆为了在阿姆斯特丹打发时间&#xff0c;决心开发一个新的脚本解释程序&#xff0c;作为ABC语言的一种继承。 最新的TIOBE排行榜&#xff…

20155302 2016-2017-2 《Java程序设计》第六周学习总结

20155302 2016-2017-2 《Java程序设计》第6周学习总结 教材学习内容总结 Java中的流分为两种&#xff0c;一种是字节流&#xff0c;另一种是字符流&#xff0c;分别由四个抽象类来表示&#xff08;每种流包括输入和输出两种所以一共四个&#xff09;:InputStream&#xff0c;Ou…

找不到tgp饥荒专用服务器,饥荒tgp版专用服务器搭建指南_游侠网

《饥荒》很多玩家购买了tgp版&#xff0c;对于服务器的搭建还不熟悉。下面小编带来《饥荒》tgp版专用服务器搭建指南&#xff0c;一起来看吧。1.创建以下文件夹\\(我的)文档\Klei\\DoNotStarveTogetherRail\MyDediServer\\(我的)文档\Klei\\DoNotStarveTogetherRail\MyDediServ…

elementui源码_Element UI 终于还是来啦

昨天&#xff0c; Element Plus for Vue 3.0 Beta 版本正式发布了&#xff01;对&#xff0c;就是那个被外界传言不再维护的Element UI&#xff01;Element Plus for Vue 3.0 是一个使用 TypeScript Composition API 重构的全新项目。官方团队几乎重写了每一行 代码&#xff0…

复地邮箱服务器地址,打印服务器设置方法

现在很多人会使用打印机&#xff0c;打印机可以帮助我们打印一些资料&#xff0c;但是很多人之前可能没有使用过打印机&#xff0c;因此自己购买了之后发现不会使用&#xff0c;不会设置&#xff0c;今天就为您介绍一下打印服务器安装设置&#xff0c;希望对您有帮助。打印服务…

腐蚀rust研究台抽奖_中石化青岛安工院专家分享延迟焦化装置的腐蚀风险分析!...

延迟焦化装置的腐蚀风险分析李贵军&#xff0c;单广斌(中国石化青岛安全工程研究院)主要内容&#xff1a;对某延迟焦化装置的腐蚀情况进行了描述&#xff0c;根据装置的流程特点、操作条件、设备选材和结构&#xff0c;对装置的腐蚀类型和腐蚀原因进行了分析&#xff0c;提出了…

目标检测如何计算召回率_计算机视觉目标检测的框架与过程

计算机视觉个人接触机器视觉的时间不长&#xff0c;对于机器学习在目标检测的大体的框架和过程有了一个初步的了解&#xff0c;不知道对不对&#xff0c;如有错误&#xff0c;请各位大牛不吝指点。目标的检测大体框架&#xff1a;计算机视觉目标检测分为以下几个步骤&#xff1…

修改wap游戏服务器,修改wap游戏服务器

修改wap游戏服务器 内容精选换一换部署游戏应用前&#xff0c;您需要准备硬件以及华为云的环境&#xff0c;主要包括以下内容&#xff1a;硬件环境&#xff1a;您需要准备一台带有显卡的Windows机器&#xff0c;硬盘至少20G&#xff0c;用于运行游戏客户端。若您不需要运行游戏…