#include<iostream>
using namespace std;

void middl(int &p,int &q,int &r)//找枢轴,然后把枢轴位置都换到第一位,左中右从小到大,取中值,放在左边第一个
{

if (p > q) swap(p, q);
if (p > r) swap(p, r);
if (q > r) swap(q, r);
swap(p, q);

}

void quicksort(int *a,int L,int R)//和枢轴相同的数可以和枢轴放一起来缩小下次快排的规模
{

if (L < R)
{
int mid = (L + R)/2;
middl(a[L],a[mid],a[R]);
int count1 = L, count2 = R;
int i = L, j = R, key = a[L];

while (i < j)//一趟快排的总控制
{
while (i < j && a[j] > key)j--;//控制j从后往前找第一比key小的
while (i < j)
{
if (a[j] == key)//在右边找到和枢轴相同的数放到数组最右端
{
int term;
term = a[count2];
a[count2] = a[j];
a[j] = term;//在右边找到和枢轴相同的数放到数组最右端
count2 --;
j--;
while (i < j && a[j] > key)j--;//找到和key相同的数移动后还要继续找比key小的
}
else
{
a[i++] = a[j];//因为轴值已经记录为key,而a[0]为轴值
break;//加个break是为了一旦找到比key值小的就不再循环
}

}
while (i < j && a[i] < key)i++;//控制i从右往左找第一个比key大的
while (i < j)
{
if(a[i] == key)//在左边找到的和key相同的值放到数组最左端
{
int term;
term = a[count1];
a[count1] = a[i];
a[i] = term;//在左边找到的和key相同的值放到数组最左端
count1 ++;
i++;
while (i < j && a[i] < key)i++;
}
else
{
a[j--] = a[i];
break;
}

}
}
a[i] = key;//现在a[i]里面值并不是key而是最近比key大或者小的值,但是已经赋值给了i或者j最近变动的地方,所以要复制key,也没有事情
int pivot = i;//用一个变量保存当前枢轴位置,因为下边ij都变了,
for(int t1 = L;t1 < count1;t1 ++)//最左边与key值相同的数,与i左边的值交换
{
int term;
term = a[--i];
a[i] = a[t1];
a[t1] = term;
}
for(int t2 = R;t2 > count2;t2 --)//最左边与key值相同的数,与i左边的值交换
{
int term;
term = a[++j];
a[j] = a[t2];
a[t2] = term;
}
quicksort(a,L,pivot - count1 - 1 + L);
quicksort(a,pivot + R - count2 + 1,R);
}
}

int main()
{

int num;
cout<<"请输入排序的规模!"<<endl ;
cin>> num;
int *a = new int[num];
int i;
for(i = 0;i < num;i++)
{
cin>>a[i];
}
cout<<"输出原始数组!"<<endl;
for(i = 0;i < num;i++)
{
cout<<a[i]<< " ";
}
cout<<endl;

quicksort(a,0,num - 1);
for(i = 0;i < num;i++)
{
cout<<a[i]<< " ";
}

cout<<endl;
return 0;
}

快速排序,对于相同元素的优化,c++的更多相关文章

  1. QuickSort快速排序的多种实现和优化

    并不是很懂wikipedia上面说快排的空间复杂度最坏情况是O(NlogN)啊,难道不是空间复杂度平均O(logN),最坏O(N)么--原地快排难道不是只要算递归栈深度就好了么--有谁给我解释一下啊( ...

  2. 快速排序 java实现 (原理-优化) 三路快排

    一.基本的快速排序 在数组中选取一个元素为基点,然后想办法把这个基点元素移动到它在排好序后的最终位置,使得新数组中在这个基点之前的元素都小于这个基点,而之后的元素都大于这个基点,然后再对前后两部分数组 ...

  3. 前端dom元素的操作优化建议

    参考自:http://blog.csdn.net/xuexiaodong009/article/details/51810252 其实在web开发中,单纯因为js导致性能问题的很少,主要都是因为DOM ...

  4. MIP 技术月报(4月):支持熊掌号登录;优化页面悬浮元素

    之前由MIP团队维护的<移动 Web 加速技术月报>从本期开始,正式升级为<MIP 技术月报>,与以往不同的是,<MIP 技术月报>将会与大家分享包含移动加速技术以 ...

  5. 快速排序的java实现

    快速排序也属于“交换”类的排序. 核心思想可以概括为:通过多次划分操作实现排序.每一趟选择当前所有子序列中的一个关键字(通常是第一个)作为枢轴,将小于它的元素统统放到它的前面,大于它的统统放到它的后面 ...

  6. 洛谷 P1177 【模板】快速排序

    这道题用传统快排(如下所示)的结果就是最后三个点TLE: void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } void ...

  7. JavaScript性能优化

    如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度. 这种情况下决定程序速度的另一个重要因素就是代码本身. 在这里我们会分门别类的介绍J ...

  8. 一道面试题:按照其描述要求用java语言实现快速排序

    回来想了想,写出了如下的程序: /** * 一道面试题,按照其描述要求进行快速排序(英文的,希望理解是对的..) * 要求:和一般的快速排序算法不同的是,它不是依次交换pivot和左右元素节点(交换2 ...

  9. C#快速排序详解

    使用快速排序法对一列数字进行排序的过程 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). 步骤为: 从数列中挑出一个元素,称 ...

随机推荐

  1. SpringMVC09 Converter变流器、数据回显、异常测试

    1.配置web.xml文件 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3// ...

  2. 19.CentOS7下PostgreSQL安装过程

    CentOS7下PostgreSQL安装过程 装包 sudo yum install postgresql-server postgresql-contrib 说明: 这种方式直接明了,其他方法也可以 ...

  3. mysql-作业

    一.表关系 请创建如下表,并创建相关约束                 班级表:class       学生表:student       cid caption grade_id   sid sn ...

  4. IIS发布网站出错解决方案

    1.第一类错误(Web服务器被配置为不列出此目录的内容) 问题所在没有为请求的URL设置默认文档,在IIS“默认文档”添加一个你要访问的默认文档名字,如:Default.aspx. 2.第二类错误(请 ...

  5. ArcGIS中合并空间有压盖关系的要素属性

    1.前言 在客户单位, 被客户问道这样一个问题“如何合并两个有压盖关系图层的属性信息?” 在工具箱里面可以使用以下工具解决: 2.处理过程 (1)在工具箱中选择Spatial Join工具,并设置相关 ...

  6. Jquery删除table里面checkbox选中的多个行

    自己闲来无聊,写了一篇关于jq选中复选框删除数据的一个功能,不足之处,还望多多包涵 js代码 <script type="text/javascript" src=" ...

  7. Log4j知识汇总

    Log4j在java开发中还是很常见的,而在日志系统里面也占有举足轻重的地位,想要做好日志相关的工作,了解log4j还是很必要的. 下面就针对 log4j的官方文档user-guide 进行翻译与整理 ...

  8. ADO数据库编程详解(C++)----初级入门篇

    一.概述 ADO即Microsoft ActiveXData Object,是Microsoft继ODBC之后,基于OLE DB技术的一种数据库操作技术,使您能够编写通过 OLE DB提供者对在数据库 ...

  9. yum安装软件并保留下载的软件

    使用yum插件downloadonly下载安装软件需要的依赖包并保留到指定的文件 安装yum-downloadonly或 yum-plugin-downloadonly 软件包. yum instal ...

  10. IDA逆向:数组的逆向

    阅读<IDA Pro权威指南>第八章,整理的一些笔记,作为逆向的基础,可能有很多认识不足. //全局分配数组 *************************************** ...