这里是题目

快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++选手请不要试图使用STL,虽然你可以使用sort一遍过,但是你并没有掌握快速排序算法的精髓。)

切,我就要用sort咋滴???

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h> //万能
using namespace std;
int arr[10000000]={0};//定义排序的数组
int main()
{
int n;
cin>>n;//输入要排序的个数
for(int i=0;i<n;i++)
{
cin>>arr[i];//循环输入
}
sort(arr,arr+n);//重点代码(STL大法好)
for(int i=0;i<n;i++)
{
cout<<arr[i]<<" ";//循环输出排序后的数
}
cout<<endl;//好习惯换行
return owo;//Ctrl+C改
}

额,C++选手注意了,比赛中你可以用sort,但是你还是没有掌握快排的精华

当然,比赛中我是推荐大家用sort的,万一你quick_sort记不住呢

好吧,不皮了,下面是正常点的代码

等等,再发代码之前……

你得知道什么是qsort啊!

这…其实就是让你自己去写sort函数啦,不过要注意是void型哦~

———————————————华丽的分割线————————————————-

下面是AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<bits/stdc++.h>//万能头好了(不过注意有些比赛是不能用万能头的) 
using namespace std;//别忘了命名空间
int n,a[1000005]= { }; //不忘初始化
void qsort(int l,int r) {
int mid=a[(l+r)/2];
int i=l,j=r;
do {
while(a[i]<mid)
i++;//在左半部分寻找比中间数大的数
while(a[j]>mid)
j--;//在右半部分寻找比中间数小的数
if(i<=j)
swap(a[i],a[j]);//交换两个数的位置
i++;//继续找
j--;//继续找
} while(i<=j);
if(l<j) qsort(l,j);//搜索左半部分
if(i<r) qsort(i,r);//搜索右半部分
}
int main() {
cin>>n;//输入排序的数的个数
for(int i=1; i<=n; i++)
cin>>a[i];//循环输入要排序的数
qsort(1,n);//调用函数进行排序
for(int i=1; i<=n; i++)
cout<<a[i]<<" ";//循环输出
return 0;//算了不恶搞了
}//完美结束!

注释都写了,请看懂程序再复制哦~


P.S:其实我的qsort过不了,请自行加优化~

有错误请指出,本蒟蒻会看的哦