1064 快速排序
2015-07-22 14:39
309 查看
快速排序
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 1096 测试通过 : 422
比赛描述
给定输入排序元素数目n和相应的n个元素,写出程序,利用内排序算法中快速排序算法进行排序,并输出排序最后结果的相应序列。
输入
共两行,第一行给出排序元素数目n,第二行给出n个元素,1≤n≤100000,每个元素值范围为 [0,100000)
输出
一行,输出排序结果。
样例输入
7
48 36 68 72 12 48 2
样例输出
2 12 36 48 48 68 72
快排.......................
快排网上的资料比较多,我这个也是对照网上资料修改的,一直以来不太明白快速排序算法的原理,现在算是明白了
下面是自己的理解,可能会有
以第一个数为基准数据,找个变量存下来,设置两个指针(表述当前数组下标的位置)
起始时,一个在0处,一个在数组的最大下标处
然后一个从后往前找比基准小的数,找到后,停下
下面的处理有两种,也就是两种不同的方法:
第一种:
把这个数放到数组的第一位,刚才咱们已经用另外一个数保存了数组的第一位数,现在覆盖也没关系,
然后这个数的刚才位置就空下来(意思是说这里的数据下次被覆盖也没关系了)
然后,开始下一个指针从前向后找比这个基准小的数,找到后,放在刚才空下来的位置,
重复以上操作,直到两个指针指着同一个位置,现在这个位置绝对是空着的(想想为什么),那就把基准数据放进去
第二种:
另外一个指针从前往后找小于或等于的数,找到后,和刚才找到的比基准大的数交换一下位置,
一直这样下去,直到两个指针指着同一位置,这个位置的数绝对不会大于刚才的基准(看看上面的规则),然后基准和这个位置的数据交换一下,
这就是一趟排序了,无论哪种方法,现在的结果都是,基准数左边的数都不会大于基准,右边的数都不会小于基准,
然后用递归算法,这样一直分割(这样的算是每次分割成三部分,左边,右边,基准),直到每一次递归都不运行了(排序完成)......
思想都一样.......应该没问题....
#include<stdio.h> #include<string.h> void qsort(int x[],int left,int right) { if(left<right) { int key=x[left],i=left,j=right; while(i<j) { while(x[j]>=key&&i<j) { --j; } x[i]=x[j]; while(x[i]<=key&&i<j) { ++i; } x[j]=x[i]; } x[i]=key; qsort(x,left,i-1); qsort(x,i+1,right); } } int main() { int i,n,x[100005]; while(~scanf("%d",&n)) { memset(x,0,sizeof(x)); for(i=0;i<n;++i) { scanf("%d",&x[i]); } qsort(x,0,n-1); for(i=0;i<n-1;++i) { printf("%d ",x[i]); } printf("%d\n",x[i]); } return 0; }
相关文章推荐
- LeetCode 204. Count Primes
- Struts2获取request三种方法
- Spring学习之声明式事务处理实例(DriverManagerDataSource注入)
- spark开发随笔记录-引入第三方包导致编译不通过
- Android Studio使用技巧系列教程(一)
- hdu5288
- HBase客户端查找数据过程
- 知识储备:Android ADB介绍
- Java Web中getAttribute和getParameter的区别
- 通过用户选择获取各种东西
- 如何确定设备的DPI
- 指令吞吐量
- Zookeeper开源客户端框架Curator简介
- python循环
- spinlock implementation with arm
- NSLayoutConstraints加动画来改变约束
- 【Linux】linux常用基本命令
- nunit的用法
- 关于 telnet 在windows 中的乱码问题
- 如何安装Matlab版libsvm