#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;
}

最新文章

  1. C++中的vector 用法解析
  2. AngularJS的$watch用法
  3. 搭建java,oracle,plsql开发环境
  4. 转:Web应用程序项目XX已配置为使用IIS
  5. 应用内存优化之OnLowMemory&amp;OnTrimMemory
  6. 为dedecms v5.7的ckeditor添加jwplayer插件
  7. linux命令chown修改文件所有权
  8. AJAX Data 传值 无效的JSON基元:AJAX jQuery的方法,用c#WEBMETHOD-c#,jquery.
  9. Linux升级Python提示Tkinter模块找不到解决
  10. 逆向project第004篇:令计算器程序显示汉字(下)
  11. Vim入门学习之Vim解析
  12. Android测试(二)——adb常用命令
  13. React系列文章:Babel编译JSX生成代码
  14. php优秀框架codeigniter学习系列——common.php
  15. python day 09 文件操作
  16. jieba分词(3)
  17. 常用的vi/vim基本命令(持续更新)
  18. MySQL: tinyint(1) 和 tinyint(4), char 和varchar
  19. 用JIRA管理你的项目
  20. 榨取kkksc03 多维dp

热门文章

  1. HDU 5505——GT and numbers——————【素数】
  2. &lt;Win7硬件故障分析&gt;
  3. javascript获取滚动条位置(兼容所有浏览器)
  4. 映射部署tomcat
  5. 解决Maven依赖下载不全的问题
  6. mysql对库,表,数据类型的操作以及完整性约束
  7. Oracle Form个性化案例(一)
  8. C#cmd执行命令隐藏窗口,并保持程序一直运行
  9. 【Android开发笔记】生命周期研究
  10. Notification高级技巧