题目具体内容如下:
其实做这道题之前我只知道快排的大概思想,不知道如何具体实现以及一些处理细节,看了一些讲解视频和博客后选择用最基本的算法,但是超时了┭┮﹏┭┮
超时代码如下:
#include<iostream>
#include <vector>
#include <algorithm>
using namespace std;
void quickSort(vector<int> &num,int left,int right){
if(left>=right)
return ;
int i=left,j=right;
int key = num[left];
while(i<j){
while(num[j]>=key&&i<j)
j--;
num[i] = num[j];
while(num[i]<=key&&i<j)
i++;
num[j] = num[i];
}
num[i] = key;
quickSort(num,left,i-1);
quickSort(num,i+1,right);
}
int main(){
int n;
cin>>n;
vector<int> num(n);
for(int i=0;i<num.size();++i)
cin>>num[i];
quickSort(num,0,num.size()-1);
for(int i=0;i<num.size();++i)
cout<<num[i]<<" ";
return 0;
}
后来在网上学习了优化后的快排,感觉确实比上面超时的更简洁一些。
优化代码如下:
#include<iostream>
#include <vector>
#include <algorithm>
using namespace std;
void quickSort(vector<int> &num,int left,int right){
if(left>=right)
return ;
int i=left,j=right;
int key = num[(left+right)/2];
while(i<=j){
while(num[j]>key)
j--;
while(num[i]<key)
i++;
if(i<=j){
swap(num[i],num[j]);
i++;
j--;
}
}
quickSort(num,left,j);
quickSort(num,i,right);
}
int main(){
int n;
cin>>n;
vector<int> num(n);
for(int i=0;i<num.size();++i)
cin>>num[i];
quickSort(num,0,num.size()-1);
for(int i=0;i<num.size();++i)
cout<<num[i]<<" ";
return 0;
}
我还要继续学习,继续努力。