Description
给定N(N≤10^5)个整数,要求用快速排序对数据进行升序排列,注意不得使用STL。
Input
连续输入多组数据,每组输入数据第一行给出正整数N(≤10^5),随后给出N个整数,数字间以空格分隔。
Output
输出排序后的结果,数字间以一个空格间隔,行末不得有多余空格。
Sample
Input
8
49 38 65 97 76 13 27 49
Output
13 27 38 49 49 65 76 97
Hint
话不多说上代码:不懂看下面解释
#include <stdio.h>
#include <stdlib.h>
void f(int *a,int x,int y) //快速排序函数;
{
if(x>=y) return ;
int i=x,j=y,k = a[i];
while(i<j)
{
while(i<j&&a[j]>=k) //不要忘记等号;
j--;
a[i] = a[j];
while(i<j&&a[i]<=k)
i++;
a[j] = a[i];
}
a[i] = k;
f(a,x,i-1); //左边调用函数;
f(a,i+1,y); //右边调用函数;
}
int main()
{
int a[100001];
int i,n;
while(~scanf("%d",&n))
{
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
f(a,0,n-1);
for(i=0; i<n-1; i++)
printf("%d ",a[i]);
printf("%d\n",a[i]);
}
return 0;
}
我们之前学的冒泡排序要每两个数交换,效率不高,费时间较多,所以正如题目名快速排序,所以如果用冒泡排序一定是超时的,那我就介绍一下快速排序
快速排序具有:内存固定,可随计划,复杂度低等优点;
快速排序采用 分治法
也就是将大问题划分为小问题,对数组排序就是将数组划分,直至划分为一个元素一部分
那要怎么划分:
第一步:选定第一个元素为基准数并保存,当我们拿出基准数后就出现里一个空位这样就可以进行内部移动
第二部:比较分类,怎么分类呢?以升序为例,用两个指针分别指向第一个和最后一个元素,将小于基准数的放在左边,大于或等于基准数的放在右边,具体操作看上面代码;
最终两指针相遇,结束;现在数组被分为两部分,再用递归调用分别对左右两部分操作,直至每一部分只有一个元素
下面有一个动态演示图链接;
添加链接描述