快速排序
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
具体步骤为:
- 从数列中挑出一个元素,称为“基准”(pivot)。
- 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
#include <iostream>
using namespace std;
int a[10000];
void quick_sort(int l,int r)
{
if(l<r)
{
int i=l,j=r;
int x=a[i];
while(i<j)
{
while(i<j&&a[j]>x)
j--;
if(i<j)
a[i++]=a[j];
while(i<j&&a[i]<x)
i++;
if(i<j)
a[j--]=a[i];
}
a[i]=x;
quick_sort(l,i-1);
quick_sort(i+1,r);
}
}
int main()
{
int n;
cin >>n;
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
quick_sort(1,n);
for(int i=1;i<=n;i++)
{
cout << a[i] << ' ';
}
return 0;
}