快速排序

  快速排序是面试中经常问到的排序算法

  基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,

  则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的

  代码如下:

  1.swap 交换函数

void swap(int& a,int& b)
{
int temp = a;
a = b;
b = temp;
}

  2.Partition函数—快速排序中最关键的函数

int Partition(int* list,int low,int high)
{
int pivot = list[low];
while(low<high)
{
while(low<high&&list[high]>=pivot)
high--;
swap(list[low],list[high]);
while(low<high&&list[low]<=pivot)
low++;
swap(list[low],list[high]);
}
return low;
}

 3.QSort函数—快速排序算法实现—递归

void QSort(int* list,int low ,int high)
{
int pivotKey;
if(low<high)
{
pivotKey = Partition(list,low,high);
QSort(list,low,pivotKey-1);
QSort(list,pivotKey+1,high);
}
}

  改进算法:
  1.优化选取枢轴

    Partition函数中选取pivotKey是一个关键,如果pivotKey选取的不是中间数,效率会受到不同程度的影响

    比如数组{9,1,5,8,3,7,6,2},pivotKey = 9,partition结果是最后一位,只是实现了9和2的互换

    改进办法:

      1.取随机数

      2.三数取中:取三个关键字先进行排序,将中间数作为枢轴,一般是取左端、右端、中间三个数

      在Partition基础之上,添加、修改成如下代码:

   int pivotKey;
int m = low+(high-low)/2;
if(list[low]>list[high])
swap(list[low],list[high]);
if(list[m]>list[high])
swap(list[m],list[high]);
if(list[m]<list[low])
swap(list[m],list[low]);
   pivotKey = list[m];

      当然也可以九数取中  

  2.优化不必要的交换

int Partition2(int* list,int low,int high)
{
int pivotKey;
//可以加上三数取中
pivotKey = list[low];
int temp = pivotKey;
while(low<high)
{
while(low<high&&list[high]>=pivotKey)
high--;
list[low] = list[high];
while(low<high&&list[low]<=pivotKey)
low++;
list[high] = list[low]
}
list[low] = temp;
return low;
}

  3.优化小数组时的排序方案

    如果数组是小数组,应该采用插入排序,如果数组较长,应该采用快速排序 

void QSort1(int* list,int low,int high)
{
int pivot;
if((high-low)>MAX_LENGTH)
{
pivot = Partition(list,low,high);
QSort1(list,low,pivot-1);
QSort1(list,pivot+1,high);
}else{ InsertSort(list);
}
}

  4.优化递归操作

void QSort2(int *list,int low,int high)
{
int pivot;
if((high-low)>MAX_LENGTH)
{
while(low<high)
{
pivot = Partition(list,low,high);
QSort2(list,low,pivot-1);
low = pivot+1;
}
}else
{
InsertSort(list);
}
}

快速排序(C++)的更多相关文章

  1. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  2. 算法与数据结构(十六) 快速排序(Swift 3.0版)

    上篇博客我们主要聊了比较高效的归并排序算法,本篇博客我们就来介绍另一种高效的排序算法:快速排序.快速排序的思想与归并排序类似,都是采用分而治之的方式进行排序的.快速排序的思想主要是取出无序序列中第一个 ...

  3. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

  4. 排序算法----调用库函数qsort进行快速排序

    功 能: 快速排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const ...

  5. Html5 快速排序演示

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

  6. Java 快速排序两种实现

    快速排序,只要学习过编程的人肯定都听说过这个名词,但是有时候写的时候还真蒙住了,网上搜罗了下以及查阅了"introduction to algorithm",暂时找到两种实现快排的 ...

  7. java基础算法之快速排序

    快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.figh ...

  8. PAT 1045. 快速排序(25)

    著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列,请问有多 ...

  9. 快速排序中的partition函数的枢纽元选择,代码细节,以及其标准实现

    很多笔试面试都喜欢考察快排,叫你手写一个也不是啥事.我很早之前就学了这个,对快速排序的过程是很清楚的.但是最近自己尝试手写,发现之前对算法的细节把握不够精准,很多地方甚至只是大脑中的一个映像,而没有理 ...

  10. php冒泡排序和快速排序

    如有错误,请指出... //快速排序(array_merge整合数组)function quick_sort($arr){ $num=count($arr); if($num<=1){ retu ...

随机推荐

  1. 在Windows7/8/10 64位操作系统下安装并注册ocx控件

    例如: 先网上下载一个MtbLine.ocx控件放入C:\Windows\SysWOW64\目录下 1.首先确保你的 Windows7 账户是管理员权限 2.下载MtbLine.ocx控件,网上可搜到 ...

  2. C++第三十三篇 -- 研究一下Windows驱动开发(一)内部构造介绍

    因为工作原因,需要做一些与网卡有关的测试,其中涉及到了驱动这一块的知识,虽然程序可以运行,但是不搞清楚,心里总是不安,觉得没理解清楚.因此想看一下驱动开发.查了很多资料,看到有人推荐Windows驱动 ...

  3. time() 在thinkphp 3.2.3 模板格式化输出

    {$ltime|date="Y-m-d",###}

  4. Docker安装Kong API Gateway并使用

    我最新最全的文章都在南瓜慢说 www.pkslow.com,文章更新也只在官网,欢迎大家来喝茶~~ 1 简介 Kong不是一个简单的产品,本文讲的Kong主要指的是Kong API Gateway,即 ...

  5. Js实现随机某个li样式增加

    一.首先引入jquery  cdn   二.基础样式 三.目的 为了使随机某个li背后有个旋转的图片 四.核心代码 html代码: <div class="bg3"> ...

  6. python之(mysql数据库操作)

    前言:关心3步骤(此文章只针对python自动化根基展开描述) 什么是mysql数据库操作?  答:利用python对mysql数据库进行增, 删, 改, 查 操作 为什么要用python对mysql ...

  7. Android面试大揭秘!从技术面被“虐”到征服CTO,全凭这份强到离谱的pdf

    在笔者面试这一个月,看了不少文章,也刷了不少面试题,但真正有深度,适合4年及以上Android高工的内容少之又少 在面试准备阶段,笔者准备了三个月左右的时间,结合相关资料及源码,完成了一系列的深度学习 ...

  8. 深入理解jvm-2Edition-Java内存区域

    1.运行时数据区域 Java虚拟机会将内存区域划分为几个区域,每个区域储存不同类型的数据或承担不同的功能. PC,堆-Java堆,栈-虚拟机栈.本地方法栈,方法区.直接内存. 当类被实例化或stati ...

  9. 跟我一起写 Makefile(五)

    六.多目标 Makefile的规则中的目标可以不止一个,其支持多目标,有可能我们的多个目标同时依赖于一个文件,并且其生成的命令大体类似.于是我们就能把其合并起来.当然,多个目标的生成规则的执行命令是同 ...

  10. K8S日志接入sls配置

    背景 原有日志方案查询日志很不方便且效率低,而且也不支持基于日志的高级操作.如:聚合,图形展示,关键字检测等. 方案 接入阿里云的sls日志服务. 实施 1.通过环境变量进行日志接入 配置如下: 字段 ...