(快排)51NOD 1018 排序

给出N个整数,对着N个整数进行排序
 
Input
第1行:整数的数量N(1 <= N <= 50000)
第2 - N + 1行:待排序的整数(-10^9 <= A[i] <= 10^9)
Output
共n行,按照递增序输出排序好的数据。
Input示例
5
5
4
3
2
1
Output示例
1
2
3
4
5
解:快速排序,两边同时比较、交换。
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int sn[50005];
 5 
 6 void swap(int a, int b)
 7 {
 8     sn[a] ^= sn[b];
 9     sn[b] ^= sn[a];
10     sn[a] ^= sn[b];
11 }
12 
13 void quicksort(int st, int en)//双指针法
14 {
15     if(en - st <= 1) return;
16     int i = st, j = en;
17     while (i < j)
18     {
19         while (sn[--j] >= sn[st] && j > i);
20         while (sn[++i] <= sn[st] && j > i);
21         if (i < j) swap(i, j);
22     }
23     if(j > st) swap(st, j);
24     quicksort(st, j);
25     quicksort(j + 1, en);
26 }
27 
28 void quicksort2(int st, int en)//挖坑法
29 {
30     if(en - st <= 1) return;
31     int i = st, j = en;
32     int tmp = sn[st];
33     while (i < j)
34     {
35         while (sn[--j] >= tmp && i < j);
36         sn[i] = sn[j];
37         while (sn[++i] <= tmp && i < j);
38         sn[j] = sn[i];
39     }
40     sn[j] = tmp;
41     quicksort(st, j);
42     quicksort(j + 1, en);
43 }
44 
45 int main()
46 {
47     int n;
48     while (scanf_s("%d", &n) != EOF)
49     {
50         for (int i = 0; i < n; i++) scanf_s("%d", &sn[i]);
51         quicksort(0, n);
52         for (int i = 0; i < n; i++) printf("%d\n", sn[i]);
53     }
54     return 0;
55 }

 

 

 

 

 

posted @ 2018-09-11 13:54  Ekalos  阅读(209)  评论(0编辑  收藏  举报