#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. javascript获取滚动条位置(兼容所有浏览器)

    有两种方式来获取浏览器滚动条的位置 第一种:document.documentElement.scrollTop 第二种:$("body").scrollTop() 第一种方式能够 ...

  2. Java调用SQL Server的存储过程详解(转)

    1使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列.不带参数的 call 转义序列的语法如下所示: 以下是引用片段:{call proce ...

  3. vue安装及环境搭建

    vue项目在pycharm里运行需要安装一个插件,打开settings,找到plugins,里面搜索vue.js,点击安装. vue安装 先安装node.js npm install -g @vue/ ...

  4. redis空间键详解

    前言 redis的空间键通知是在2.8.0版本以后加入的,客户端通过发布订阅的方式,订阅某个频道,接收通过某种方式影响redis中数据的事件. 目录: 1.空间键事件分类 2.如何启用redis的空间 ...

  5. 【Android车载系统 News | Tech 5】车载设计开发

    1. 基于Android的车载移动终端系统的研究与开发 http://wenku.baidu.com/link?url=hIKlQ2myEmR8N0CA28a_SLzLA2Q9R5Xpk20OJ53h ...

  6. 小div在大div里面 垂直居中

    方法1: .parent { width:800px; height:500px; border:2px solid #000; position:relative; } .child { width ...

  7. centos7.4 安装后的基本设置

    centos7.4 安装后的基本设置 设置主机名称 设置IP地址,网关 修改网卡名称 内核优化 系统安全设置 防火墙设置 ssh设置 同步系统时间 安装基础软件包 软件配置 设置主机名称 hostna ...

  8. jenkins代码自动部署

    jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...

  9. 关于前端的交互 ajax

    对于交互来说,可以利用原生的javascript和jquery 这篇说的就是jquery 1 不是跨域的 利用$ajax({})这个函数实现的 $.ajax({ url: "", ...

  10. hiho一下 第三十九周 归并排序求逆序数

    题目链接:http://hihocoder.com/contest/hiho39/problem/1 ,归并排序求逆序数. 其实这道题也是可以用树状数组来做的,不过数据都比较大,所以要离散化预处理一下 ...