#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. SpringBoot | 第二十一章:异步开发之异步调用

    前言 上一章节,我们知道了如何进行异步请求的处理.除了异步请求,一般上我们用的比较多的应该是异步调用.通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的.比如记录日志信息等业务.这个时候 ...

  2. Docker | 第零章:前言

    说在前面 对于一个后端开发者而言,对于Docker也是前年十月份才开始听说的(很惭愧,Docker在2013年就已经出现了).当时有个新项目启动,领导们在技术选型时,在部署方面选定的是Docker.那 ...

  3. JS for循环删除数组元素

    $(function(){ var aa = [1,1,2,3,3,4,4,5]; alert(aa); for (var i = aa.length-1;i >= 0 ;i--) { if ( ...

  4. 发布MVC网站的时候出现缺少WebHost等程序集问题的解决办法

    将一下几个dll 拷贝到bin文件夹下就行 链接:https://pan.baidu.com/s/17xhTdakzM_SQmOjJdZvviw 密码:c976

  5. 从零开始的全栈工程师——js篇2.7(JS数据类型具体分析)

    JS数据类型具体分析与数据的三大存储格式 1. 字符串 string2. 数字 number3. 布尔 boolean4. null 空5. undefined 未定义↑↑↑叫基本数据类型 基本数据类 ...

  6. 2013 QConf上海软件开发大会总结

    带着工作中的一些疑问,我参加了在上海举办的QConf 全球软件开发大会.会议以主题的形式按分会场召开,我主要选择知名网站案例分析.大数据处理技术.高效能团队建设和金融系统架构与设计四个主题内容.三天会 ...

  7. System Center Configuration Manager 2016 域准备篇(Part3)

    步骤2.将CM16加入域 注意:在ConfigMgr服务器(CM16 )上以本地管理员身份执行以下操作 手动加入域,请登录CM16.启动Windows文件资源管理器 右键单击This-PC,然后选择 ...

  8. python3基础09(装饰器的使用)

    #!/usr/bin/env python# -*- coding:utf-8 -*- import time #方式1class People: def __init__(self, name, a ...

  9. Python爬虫实战:爬糗事百科的段子

    一个偶然的机会接触了Python,感觉很好用,但是一直在看c++啥的,也没系统学习.用过之后也荒废了许久.之前想建个公众号自动爬糗事百科的段子,但是没能建起来,真是尴尬,代码上传的服务器上之后,不能正 ...

  10. NYOJ-596-谁是最好的Coder

    原题链接 谁是最好的Coder 时间限制:1000 ms  |  内存限制:65535 KB 难度:0 描述 计科班有很多Coder,帅帅想知道自己是不是综合实力最强的coder. 帅帅喜欢帅,所以他 ...