快速排序即是在一组数据中任取一个数作为基准数,将大于这个数的数放在这个数的右边,将小于这个数的数放在这个数的左边,指针 i 和 j 从数组的左右两端移动,i 从左向右,j 从右向左。假设以数组中间的那个数作为基准数 x ,则 i 先向右移动,直到移动到一个大于 x 的数停下来,然后 j 开始向左移动,直到移动到一个小于 x 的数停下来,此时只要 i 和 j 所在地方的数互换位置即可达成大数在右小数在左的效果。此轮交换过后 i 和 j 继续重复刚才的指令,直到 i 和 j 相遇,第一轮结束。此时以 x 为分界点,x 左边的数都小于 x,x 右边的数都大于 x。再将 x 左边和右边分别看做两组数继续重复上述步骤,最终即可将所有数都从小到大排序。
代码如下:
//此行为空白行
1 #include <iostream> 2 3 using namespace std; 4 5 const int N=100000; 6 int q[N]; 7 void quick_sort(int q[],int l,int r) 8 { 9 int i=l-1,j=r+1; 10 int x=q[(l+r)/2]; 11 if(l>=r)return; 12 while(i<j) 13 { 14 do i++;while(q[i]<x); 15 do j--;while(q[j]>x); 16 if(i<j)swap(q[i],q[j]); 17 } 18 quick_sort(q,l,j); 19 quick_sort(q,j+1,r); 20 } 21 int main() 22 { 23 int n; 24 cin>>n; 25 for(int i=0;i<n;i++)cin>>q[i]; 26 quick_sort(q,0,n-1); 27 for(int i=0;i<n;i++)cout<<q[i]<<" "; 28 return 0; 29 }
(刚开始学习算法,代码运行过没有问题,但解释的可能会有不对的地方,欢迎大佬指正!)