快速排序sdut
数据结构实验之排序八:快速排序
Description
给定N(N≤10^5)个整数,要求用快速排序对数据进行升序排列,注意不得使用STL。
Input
连续输入多组数据,每组输入数据第一行给出正整数N(≤10^5),随后给出N个整数,数字间以空格分隔。
Output
输出排序后的结果,数字间以一个空格间隔,行末不得有多余空格。
Sample
Input
8 49 38 65 97 76 13 27 49
Output
13 27 38 49 49 65 76 97
快排不难理解,多写写就会了。
1 #include<stdio.h> 2 3 int a[1000000]; 4 void quick(int l, int r, int a[]) 5 { 6 if(l>=r) 7 return;//如果左右端重合或超出了,那说明没有元素需要排序了,这里的return相当于是break 8 else 9 { 10 int i = l; 11 int j = r;//设定变量用于循环 12 int key = a[i];//将第一个元素作为关键字(不是a[0]),将比key小的放到左边,比key大的放到右边 13 while(i<j)//判断有无元素在循环 14 { 15 while(i<j&&a[j]>=key)//注意等号不能少,少了等号就相当于排除自身,万一开头是49结尾也是49,那就是死循环了 16 j--;//在右边找到一个比key小的, 17 a[i] = a[j];//把小的元素放到左边,也就是key所在的地方 18 while(i<j&&a[i]<=key)//在左边找一个比key大的 19 i++; 20 a[j] = a[i];//填补上刚刚a[j]的位置相当于完成互换,一开始a[0]的值在key中 21 } 22 a[i] = key;//已经全部将元素排完,小于key在左,大与key在右,但是两边还是无序的 23 quick(l,i-1,a); 24 quick(i+1,r,a);//将两边分组好的元素再进行排序 25 } 26 } 27 int main() 28 { 29 int n; 30 while(~scanf("%d",&n)) 31 { 32 int i; 33 for(i=0;i<n;i++) 34 scanf("%d",&a[i]); 35 quick(0,n-1,a); 36 for(i=0;i<n;i++) 37 { 38 if(i==n-1) 39 printf("%d\n",a[i]); 40 else 41 printf("%d ",a[i]); 42 } 43 } 44 }

浙公网安备 33010602011771号