写给自己看的快速排序

快速排序的核心思想可以参照分治三步法:

1.划分问题 把数组元素重排后分成左右两块,使得左边的元素都小于右边的元素

2.递归求解 再把左右两边分别排序

3.合并问题 不需要合并,因为数组已经有序

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <fstream>
 4 using namespace std;
 5
 6 void quicksort(int a[],int left, int right)
 7 {
 8     if (left>=right) return; //递归结束
 9     int mark = a[left];         //取第一个数为标志
10     int st = left;
11     int ed = right;
12     while(st<ed)
13     {
14         while(st<ed && a[ed] >= mark) ed--; //从末尾开始找比mark小的数
15         if (st<ed) a[st++] = a[ed];            //先移到前端,然后st再加一(挖洞)
16         while(st<ed && a[st] < mark) st++;  //从开头找比mark大的数
17         if (st<ed) a[ed--] = a[st];            //先移到后端,然后ed再减一(填坑)
18     }
19     a[st] = mark;                            //将mark移到中间
20     quicksort(a,left,st-1);
21     quicksort(a,st+1,right);
22 }
23
24 int main()
25 {
26     ifstream fin("data.in");
27     int num ;
28     int a[100];
29     fin >> num ;
30     for (int i=0;i<num;i++)
31         fin >> a[i];
32     quicksort(a,0,num-1);
33     for (int i=0;i<num;i++) cout<<a[i]<<‘ ‘;
34     return 0;
35 }

快速排序的重点和难点应该在于如何划分数组,这里给出最常用的方法:以数组的第一位为标志位。先从末尾找到比标志位小的数A,表明该数应该被放置在标志位之前。然后把标志位当做一个需要数字来填的坑,将A填入坑中,此时A原本的位置变成了一个新坑。然后我们再从开头寻找比标志位大的数B,表明该数应该被放置在标志位之后。将B填入A原本的坑中,此时B原本的位置成为一个新坑等待下一个A来填。

如此循环下去直到两个标志指针遇见,表示数组已经遍历完成。最后,应该剩下一个B的坑位还没有填,最终我们将标志位填到里面,此时划分数组完成。

由于我们第一个挖的坑是处于数组首的标志位,所以我们需要先从末尾找起,如果先从开头找比标志位大的数B,那么这个数B将无地放置。

(如果我们以最后一个数为标志位,那么我们将先从开头找比标志位大的数B填入最后一位,然后再找A填入B原来的位置)

划分数组的本质是数字相对位置的交换,使得最终的数组成为前端任意数比后端任意数小的两个分支。对于快速排序的优化可以将标志位设定为中间的某个数字而不是第一个,然后将两个数的位置交换。这样可以使得划分的数组前后端长度相近,使算法效率提高。

时间: 2024-10-28 09:19:34

写给自己看的快速排序的相关文章

苹果发布新一代编程语言Swift,边写代码边看结果,Apple Swift 简介

每年进入夏至前一个月,便是各高校毕业生的忙碌的季节-毕业论文,经非权威的调查显示,有近百分之九十的学生不到三十天就完成了论文的写作,更有百分之四十五的人不到十天就完成了毕业论文的写作,由此声音:这毕业论文在这么短的时间内完成质量高吗?对毕业后的工作有大的价值吗,工作单位会在乎毕业论文的质量吗? 因此得观点:毕业论文要不要写? 对于很多即将毕业的同学来说,毕业论文做的好与坏结果都是同样的毕业证,实在没有必要花太多的精力,通过万岁,一切只是为了顺利毕业."如果毕业论文不是跟学位证挂钩的话,我想以大多

写给自己看的模板

这是写给自己看的模板……当然有需要的人也可以直接拿走 1.封装好的高精度模板 注意:算法的主要耗时在于高精度乘法.除法和乘方.其中高精度乘方有快速幂优化,常数大致是乘法的5~10倍.除法是用二分写的效率较低,大概是乘法的20~30倍,能不用尽量不用 #define mx 300 struct gaojing{ int len; int a[mx+10]; }zero,one; inline void set0(gaojing &s)//高精清零 { s.len=1; for (int i=1;i

读书笔记:《写给大家看的设计书》

读书笔记:<写给大家看的设计书> <写给大家看的设计书>这本书本来是买给孩子看的,孩子对板报.杂志.名片等设计很感 兴趣,想看点基础的设计类的书籍,就给她找了一本.书到手后,我随手翻了翻发现对于我制作PPT还是很有帮助的,对于非专业设计人员来说,掌握4条设计原 则确实可以让设计感觉到非常专业,这几条原则应用于网站的设计也是同样有效. 全书三大部分,共14章,第一部分(第1-8章)最有用,讲述四大设计原则,第二部分(第9-11章)讲字体设计,第三部分有点像附录. 第一章 约书亚树 有

写给大家看的面向对象编程书(摘要)

一,几乎没有哪个类可以独立地存在.在大多数情况下,如果一个类不会与其他类交互,那么根本没有理由构建它. 二,实际上,OO开发中没有全局数据.静态属性和方法会子同一个类的所有对象间共享,但是其他类的对象是无法访问的. 三,要不惜一切代价避免改变公共接口,如果对公共接口做了修改,就会导致使用该接口的所有系统产生涟漪效应. 四,要通过网络发送一个对象(例如,通过网络发送到一个文件),系统必须展开这个对象,通过网络发送,然后在网络另一端重新合成.这个过程称为串行化(serializing)一个对象.通过

《写给大忙人看的java se 8》笔记

现在才来了解java8,是不是后知后觉了点? 新的编程技术,个人不喜欢第一时间跟进. 待社区已有实践积淀再切入似乎更划算些? 一点点精明的考虑. 不多说,上代码. //读<写给大忙人看的java se 8>做的笔记代码 //希望对忙到连这书都没工夫看的你,匆匆一瞥,留下印象 //祝编程愉快 public class MainTest { //第一章,讲lambda表达式 //lambda表达式类似javascript的函数字面量,可用于替代java的匿名内部类 //基本型为 (形参列表)-&g

写给大家看的设计书——读后笔记

<写给大家看的设计书>介绍了设计的四个基本原则:亲密性.对齐.重复.对比.作为一个软件"设计师",我也来聊聊读过这本书之后,我对这四个原则的一点理解. 亲密性 亲密性原则是指:内涵相关联的内容,在结构.关系上也应保持关联.        以软件设计的角度来说,一项业务所包含的功能.一个功能所包含的代码,应该在结构.关系上保持关联.例如把这些代码放到同一个包下.用同一套规则来命名.这样,当我们需要查阅.修改这个功能,需要处理哪些代码就"一望而知"了.   

读书笔记:《写给大家看的面向对象设计》,《程序员的职业素养》,《设计模式其实很简单》

按照上次的计划 看了三本书,笔记现在才贴出来. <写给大家看的面向对象设计>: 使用接口开发的作用 规范函数命名,特别在项目人数比较多,在设计时,定了接口命名与参数. 可以把前台与后台的脱离.定义接口后,实现接口并返回模拟的数据,例如DataTable等,前台不需等后台就可以做UI与交互,改善UI与需要的数据,发现问题并不断完善接口.后台按照需求把数据库设计好了(如果是领域驱动开发,是Model创建),按照这个接口来开发功能,完成之后前台切换过来即可.前后台是并行开发. 便于单元测试的编写,其

写给大家看的编程规范

(本文参加 2014 CSDN博文大赛,谢谢.) [文章摘要] "没有规矩,不成方圆",在实际的软件开发项目中,做任何事情都不是随心所欲的,我们编写代码需要遵守项目组约定的编程规范.很遗憾,在学校的计算机课程中,重在教导学生实现一定的程序功能,对程序的编写规范很少提及,这也就导致了从学校毕业踏上工作岗位之后一段艰辛的学习过程. 本文根据自身的软件开发实践,对实际的软件开发项目中编写C语言和SQL语言程序时所需遵守的规范进行了详细的介绍,旨在让广大即将从事软件开发工作的程序员们懂得编程规

前端编程提高之旅(五)----写给大家看的css书

   自实习也有几个月的时间了,以爱奇艺实习为敲门砖,进入了目前这家公司.如果说当初能进爱奇艺是临时突击DIV+CSS的话,目前在这家公司体验到,任何技术都必须悉知原理,这样才能做到庖丁解牛,做一个内行的人.css属性和用法都摆在那里,但如果用得好,除了躬身实践,提高理论积淀就特别必要了,这本<写给大家看的css书>快速扫过一遍之后,之前工作遇到过不清楚的问题,一扫而空,所以有必要总结下.    css层叠的理解    css是层叠样式表的英文缩写,层叠意味着样式从文档结构中一个层次传递到另一