1064 快速排序

来源:互联网 发布:广安软件测试招聘 编辑:程序博客网 时间:2024/04/28 20:42

快速排序

时间限制(普通/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;}


0 0
原创粉丝点击