问题描述

在快速排序过程中, 每次会找一个划分值, 将小于划分值的放到其左边, 大于划分值的
放右边, 然后再依次递归左右两边, 对子序列进行同样的操作, 直到子序列为空则停止操作。
最后就得到了有序的序列。
如何找到一个合适的划分值? 小茗同学也不知道, 所以他用了随机算法。 小茗同学的运
气很好, 每次都刚好随机到中位数, 但是他也不知道这个过程中使用到的划分值都是多少。
所以你需要帮助小茗同学找出整个排序过程中, 用到的所有划分值, 并按照其用到的顺序输
出。
假定(1) 快速排序优先递归排序左边序列, 然后才是右边序列;
(2) 中位数定义为序列中的第⌈ n/2⌉ 大的数(n 表示序列长度, ⌈ ⌉ 表示向上取整) 。
如 3 4 1 的中位数是 3, 3 4 1 2 的中位数是 2;

★数据输入
输入的第一行为数字 n (1 ≤ n ≤ 10^5), 表示给定序列的长度。
第二行包含 n 个整数, 表示序列中的整数 a1, a2, ..., an。 (1 ≤ ai ≤ 10^9)。 序列中的数互
不相同。

★数据输出
在一行中依次输出划分值。

输入示例 输出示例
53
1 5 2 4
3 1 2 4 5

思路

  快排 二分

code

 #include <stdio.h>
#include <stdlib.h> void merge(int *p,int l,int r)
{
if(l<=r)
{
int m = (l+r)/;
printf("%d ",p[m]);
merge(p,l,m-);
merge(p,m+,r);
}
} int cmp(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
} int main()
{
int i,j;
int n;
scanf("%d",&n);
int *p = (int *)malloc(sizeof(int)*n);
for(i=;i<n;i++)
{
scanf("%d",p+i);
}
qsort(p,n,sizeof(int),cmp);
// for(i=0;i<n;i++) printf("%d ",p[i]); printf("\n");
merge(p,,n-); free(p);
return ;
}

最新文章

  1. 需要一个策略文件,但在加载此媒体时未设置checkPolicyFile标志
  2. 超市管理系统—NABCD模型
  3. 浅谈mysql集群
  4. Java数据结构之树和二叉树
  5. codeforces 631A Interview
  6. Lucene和jackson冲突
  7. Nodejs随笔(二):像可执行shell脚本一样,运行node 脚本!
  8. ajax form表单提交 input file中的文件
  9. hibernate学习笔记之中的一个(JDBC回想-ORM规范)
  10. js设计模式之惰性单例模式
  11. DVWA 黑客攻防演练(十二) DOM型 XSS 攻击 DOM Based Cross Site Scripting
  12. Msfvenom学习总结
  13. hdu 6086 -- Rikka with String(AC自动机 + 状压DP)
  14. Git设置/取消代理
  15. jQuery的extend和fn.extend理解
  16. 第1章 1.6计算机网络概述--OSI参考模型
  17. python学习笔记(二):基础知识点
  18. java Web监听器导图详解
  19. linux shell读取配置文件
  20. 关于nmake cl.exe error 0xc0000135

热门文章

  1. Debian For ARM mysql-server install information
  2. OpenCV - opencv3 图像处理 之 图像缩放( python与c++实现 )
  3. poj2010
  4. java06-数组动手动脑
  5. C#中将dateTimePicker初始值设置为空
  6. Powershell使用SSH
  7. 使用Azure Site Recovery把VM批量搬迁到Azure
  8. 在Mac系统下如何恢复SourceTree全局忽略的文件
  9. Java基础--枚举Enum
  10. urllib2模块中文翻译与学习 - Python 2.7.8官方文档