总时间限制: 2000ms 单个测试点时间限制: 500ms 内存限制: 65536kB

描述

随机输入一组数,使用快速排序得到从小到大的序列。

输入

第1行是元素的个数,第2行是各个元素的值,每个元素以空格分隔。

输出

输出有1行,即排完序后由小到大的序列,每个元素之间以空格分隔。

样例输入1

  1. 5
  2. 9 7 8 5 3

样例输出1

  1. 3 5 7 8 9

样例输入2

  1. 10
  2. 9 8 7 6 5 4 3 2 1 6

样例输出2

  1. 1 2 3 4 5 6 6 7 8 9

思路

数组排序可以如下完成:

  1. k = a[0],将k挪到适当位置,使得比k小的元素都再k的左边,比k大的元素都在k的右边,和k相等的,不关心。(在O(n)时间内完成)
  2. k左边的部分快速排序
  3. k右边的部分快速排序

例题-快速排序 - 图1

代码

  1. // Using c99 standard
  2. #include <stdio.h>
  3. void swap(int* a, int* b) {
  4. *a = (*a) ^ (*b);
  5. *b = (*a) ^ (*b); // b <- (a ^ b) ^ b, which is: b <- a
  6. *a = (*a) ^ (*b); // a <- (a ^ b) ^ a, which is: a <- b
  7. }
  8. void QuickSort
  9. (int array[], int start, int end) {
  10. if( start >= end )
  11. return;
  12. int pivot = array[start];
  13. int i = start, j = end;
  14. while(i != j) { // partition
  15. while( j > i && array[j] >= pivot )
  16. j--;
  17. swap(&array[j], &pivot);
  18. while( j > i && array[i] <= pivot )
  19. i++;
  20. swap(&array[i], &pivot);
  21. }
  22. QuickSort(array, start, i-1);
  23. QuickSort(array, i+1, end);
  24. }
  25. int main() {
  26. int number;
  27. scanf("%d", &number);
  28. int array[number];
  29. for(int i = 0; i < number; i++)
  30. scanf("%d", &array[i]);
  31. QuickSort(array, 0, 4);
  32. for(int i = 0; i < 5; i++)
  33. printf("%d ", array[i]);
  34. return 0;
  35. }