《快速排序》

117 阅读1分钟
#include <iostream>
using namespace std;
const int N = 1e6 + 10;//防止数组越界。 
int q[N], n;
void quick_sort(int q[], int l, int r) //l与r分别表示左边界与右边界。 
{
   if (l >= r) return; //判断左边界是否大于等于右边界。 
   int x = q[l + r >> 1], i = l - 1, j = r + 1; //利用两个指针遍历整个数组。 
   while (i < j) 
  { 
    do i ++; while (q[i] < x);
    do j --;while (q[j] > x);
    if (i < j) swap(q, q[j]);
  }
//如果指针所在元素小于x,左指针向右移动;否则停止,如果指针所在元素大于x,右指针向左移动,否则停止。 //最后如果左指针小于右指针,交换两个指针的位置。
//原理为(1 4 3 2 5) -> (1 4(i) 3 2(j) 5) -> (1 2(i) 3 4(j) 5) -> (1 2 3(i, j) 4 5)。
   quick_sort(q, l, j), quick_sort(q, j + 1, r); //对左右两部分进行快速排序(分治,递归的思想)。 
} 
int main()
{ 
   scanf("%d", &n); //读入数组的元素个数n。 
   for (int i = 0; i < n; i ++) scanf("%d", &q); //读入n个数。 
   quick_sort(q, 0, n - 1); //利用快速排序,对数组元素进行排序。 
   for (int i = 0; i < n; i ++) printf("%d ", q);//输入排好序的数组元素。 
   return 0; 
}