(快排)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 }