1521.排序
Time Limit: 1000 MS Memory Limit: 32768 KB
Total Submission(s): 73 Accepted Submission(s): 25
Description
将输入的数从小到大排序。
Input
输入数据n(1<=n<=1000000)
接下来输入n个数据
(多组输入数据)
Output
按格式输出排序后的n个数。
Sample Input
55 3 4 6 8
Sample Output
3 4 5 6 8
Source
Unknown
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void quicksort(int a[], int left, int right);
int a[1000000];
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
memset(a,0,sizeof(a));
for(int i = 0; i < n; i ++)
{
scanf("%d", &a[i]);
}
quicksort(a,0,n-1);
printf("%d", a[0]);
for(int i = 1; i < n; i ++)
{
printf(" %d", a[i]);
}
printf("\n");
}
return 0;
}
void quicksort(int a[], int left, int right)
{
if(left >= right)
return;
int i = left;
int j = right;
int key = a[left];
while(i < j)
{
while(j > i&&a[j] >= key)
j --;
a[i] = a[j];
while(i < j&&a[i] <= key)
i ++;
a[j] = a[i];
}
a[i] = key;
quicksort(a, left, i - 1);
quicksort(a, i + 1, right);
}
快速排序利用递归:
每一次递归是把最左边的元素当成基准,把本次所要排的的数分为,比基准大的数,和比基准小的数。
每一次递归,首先在最左边挖了个坑,从右往左找的比基准小的数,然后放入挖好的坑中,此时的坑是刚在挪走的那个数,然后从左向右找比基准大的数,放入坑中,以此类推。直到最后I,j相等,把基准数放入此时相等的值中。