很早以前看过快排算法觉得自己掌握了,,课今天用的时候发现老出错,认真想想发现自己一直搞错了。。。

下面先说一下我的想法:

首先,快排的思想就是

  1. 从数列中挑出一个元素,称为 "基准"(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

那么这里需要考虑的就是如何进行分区,这个是最重要的,先来看看我的分区的实现:(这里的provit我就不用随机数来实现了,直接选第一个)

int partition(int array[], int begin, int end) {
int index = begin;
int proviet = array[begin];
swap(array[index], array[end]);//将provit换到最后
for(int i = begin; i != end; i++) {//将小于provit的元素放到左边,大的放到右边
if (array[i] < proviet)
swap(array[index++], array[i]);
}
swap(array[index], array[end]); return index;
}

  首先,将provit移到数组的最后一位,这样在数组分区的时候就不会影响到provit,也就是这句

swap(array[index], array[end]);

假设我们要分区的数组是6 7 4 3 56 5, 那么到现在数组应该变成这样了 

然后,就要将除 provit 意外的全部元素进行遍历,此时 index 是 0,i 也从 0 开始。那么因为第一个 5 < 6,所以变成这样

到第三步,因为7>6, 所以 index 没变,而 i 自增,即这样,那么此时因为 4 < 6, 所以将 4 和 7 交换,变成这样

下面的一招这个原理即可。那么,到 for 循环完成后,数组变成如下:,这时,因为 index 位的数大于等于 privot, 所以将他们交换,最后达到的效果就是大的全在右边,小的全在左边。

然后是 quickSort()的内容:

void quickSort(int array[], int begin, int end) {
if (begin >= end)
return;
int position = partition(array, begin, end);
quickSort(array, begin, position - 1);
quickSort(array, position + 1, end);
}

  这里就是用递归的方法将数列分段进行大小分区,这个应该不难理解。因为每一段内部的元素的都比他后面段的所有元素都小,那么排出来的就应该是一个有序列了。

对于provit的选择,其实没有太多的要求,只是说你用随机数来产生的话更可能得到一个好的 provit 使得分区更好得到更好的速度。因为使用随机数法使得输入数据的次序对算法不产生影响。只有在随机数产生器给出了一个很不巧的排列时,随机化算法的最坏情况性态才会出现。事实上可以证明几乎所有的排列都可使快速排序接近平均情况性态,只有非常少的几个排列才会导致算法的近最坏情况性态。所以一般情况下采用随机数法。

如果你想用随机数来实现,可以看看这个http://code.wikia.com/wiki/Random_number

快速排序算法的c++实现的更多相关文章

  1. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

  2. C# 集合扩展快速排序算法

    /// <summary> /// 对集合进行排序,如 /// List<Person> users=new List<Person>(){.......} /// ...

  3. PHP描述冒泡排序和快速排序算法

    使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组.写一个二维数组排序算法函数,能够具有通用 ...

  4. 快速排序算法(Java)

    快速排序算法的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. class Parti ...

  5. 快速排序算法-C语言实现

    注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序.同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现.按照功能进行模块划分的思想得到了彻底地贯 ...

  6. C#快速排序算法基础入门篇

    相信算法对于许多开发人员来说都是一大难点,之所以难,就像设计模式一样,许多人在阅读之后,没有很好地理解,也不愿意动手上机操作,只停留在理论的学习上面,随着时间推移就慢慢淡忘. 有些东西,你可以发明创造 ...

  7. 快速排序算法 Quick sort

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046189.html 首先随机选择一个轴,并调整数组内各个数字,使得比轴值大的数在轴的右边, ...

  8. PHP实现快速排序算法

    快速排序(Quick Sort)是对冒泡排序的一种改进,属不稳定排序算法,由东尼·霍尔在1962年提出.快速排序基本步骤:从数列中挑出一个元素(一般称为称为“基准”),通过一趟排序将要排序的数据分割成 ...

  9. Java快速排序算法

    快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 ...

  10. 排序系列 之 快速排序算法 —— Java实现

    基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变 ...

随机推荐

  1. ocker nginx 配置反向代理和负载均衡

    1. 获取及配置nginx 如果需要全站通过docker部署,那么nginx或许是不可或缺的.通过配置nginx,可以迅速实现负载均衡和反向代理服务.值得一提的是,docker官网恰好也有nginx镜 ...

  2. HDU3157:Crazy Circuits——题解

    http://acm.hdu.edu.cn/showproblem.php?pid=3157 题目大意:给一个电路 ,起点为+,终点为-,包括起点终点在内的电元件之间有有下界边,求最小流. ————— ...

  3. AOJ.667 抢占白房子

    抢占白房子 点我挑战题目 考察点 字符串 Time Mem Len Lang 14ms 444 KB 0.75 K GCC 题意分析 数据仅有一组,根据题目,左上角的一个格子为白色,与白色相邻的(无论 ...

  4. PHP实现---汉字简体繁体转换

    這是以class包裝好的簡繁體轉換的class, 另外需要兩個table檔: 1. http://www.jerry.com.tw/php/big5.map 2. http://www.jerry.c ...

  5. 探索CAS无锁技术

    前言:关于同步,很多人都知道synchronized,Reentrantlock等加锁技术,这种方式也很好理解,是在线程访问的临界区资源上建立一个阻塞机制,需要线程等待 其它线程释放了锁,它才能运行. ...

  6. 【简单算法】37.Shuffle an Array

    题目: 打乱一个没有重复元素的数组. 示例: // 以数字集合 1, 2 和 3 初始化数组. ,,}; Solution solution = new Solution(nums); // 打乱数组 ...

  7. Ubuntu 16.04安装NVIDIA驱动后循环登录问题

    问题描述 最近买了两块NVIDIA Titan X Pascal显卡装到了服务器(运行Ubuntu 16.04)上.为了使用这两块GPU显卡,首先需要安装显卡驱动,安装方式为 #安装一个依赖文件,并更 ...

  8. SPOJ - HIGH :Highways (生成树计数)

    Highways 题目链接:https://vjudge.net/problem/SPOJ-HIGH Description: In some countries building highways ...

  9. C语言预处理

    1.由源码到可执行程序的过程(1)源码.c->(编译)->elf可执行程序(2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序(3)源码.c- ...

  10. a标签nest问题,即a标签里面嵌套a标签

    方法一:使用div模拟a,监听click事件 方法二:使用<object>标签包裹内部a标签 <div style="width: 200px;height: 200px; ...