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

本文仅用作学习记录,大神勿喷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,一经查实,立即删除!

相关文章

计算机图学测试题及答案,《计算机图形学》练习测试题及参考答案

A 29、下列有关平面几何投影的叙述语句中&#xff0c;正确的论述为( ) A) 在平面几何投影中&#xff0c;若投影中心移到距离投影面无穷远处&#xff0c;则成为平行投影&#xff1b; B) 透视投影与平行投影相比&#xff0c;视觉效果更有真实感&#xff0c;而且能真实地反映物体的…

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

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

多媒体微型计算机必不可少的硬件,第1章计算机基础知识习题材料.doc

第三部分 习 题第1章1计算机基础知识一、单项选择题1&#xff0e;通常人们普遍使用的电子计算机是( )。A&#xff0e;数字电子计算机B&#xff0e;模拟电子计算机C&#xff0e;数字模拟混合电子计算机D&#xff0e;以上都不对2&#xff0e;世界上第一台电子计算机研制成功的时间…

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

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

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

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

vue.js指令v-model实现方法

原文链接&#xff1a;http://www.jb51.net/article/99097.htm V-MODEL 是VUE 的一个指令&#xff0c;在input 控件上使用时&#xff0c;可以实现双向绑定。 通过看文档&#xff0c;发现他不过是一个语法糖。 实际是通过下面的代码来实现的&#xff1a; <% page language&quo…

山西财大华商学院计算机系,山西财经大学华商学院

山西财经大学华商学院&#xff0c;位于山西省太原市&#xff0c;是经国家教育部正式批准设立&#xff0c;由山西财经大学在2002年举办的一所全日制本科院校&#xff0c;学院紧邻山西财经大学主校区&#xff0c;目前在校学生4500余人。山西财经大学是新中国成立后建校最早的财经…

sed 解释正则表达式

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

计算机usb无法读取u盘启动,U盘中毒后造成U盘启动盘制作失败usb无法识别的解决办法...

我们想用U盘作为装系统的工具&#xff0c;必须先保证U盘的安全才能作为U盘启动盘使用&#xff0c;如果U盘一旦损坏&#xff0c;将造成USB无法识别&#xff0c;装系统也就无从下手&#xff0c;下面先讲下U盘中毒后造成U盘损坏usb无法识别的情况&#xff1a;1、识别U盘速度变得缓…

在windows下codeblocks中配置pthread库

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

吕帅 计算机学院,刘磊-吉林大学计算机科学与技术学院

在《Journal of Systems and Software》、《Pattern Recognition》、《计算机学报》、《软件学报》等国内外期刊和会议上累计发表学术论文180余篇&#xff0c;其中&#xff1a;SCI检索论文40余篇、EI检索论文100余篇。主要代表性学术论文(SCI检索学术论文、国内权威期刊论文)&a…

河南科技大学计算机基础题库,河南科技大学大学计算机基础Excel基本操作选择题汇总...

Excel基本操作1、在Excel工作表的单元格中&#xff0c;如要输入数字字符串100083(邮政编码)时&#xff0c;应输入____C___。A) 100083 B) "100083" C) 100083 D) 1000832、在单元格B1中输入数值2&#xff0c;B2中输入数值3.5&#xff0c;选定单元格区域 B1:B5&#x…

[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…

jsoup 去除html标签,如何使用jsoup取消注释html标签

Kai Sternad..7对的,这是可能的.以下是解决此问题的一种方法:查找所有评论节点对于每个注释,提取数据属性在当前注释节点之后插入包含数据的新节点删除注释节点看看这段代码:public class UncommentComments {public static void main(String... args) {String htmlIn "&…

软件测试实验二

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…

solr 的 field, copyfield ,dynamic field

Field: Field就是一个字段&#xff0c;定义一个Field很简单&#xff1a; [html] view plaincopy <field name"price" type"sfloat" indexed"true" stored"true"/> 基本上属性也和FieldType类似&#xff0c;他的属性会覆盖掉Fie…