快速排序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 }

 

posted @ 2020-06-06 11:38  爱写程序的机械师  阅读(140)  评论(0)    收藏  举报