快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。
它的基本思想是:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
方法一:
#include <iostream>
#include <vector>
using namespace std;
void quicksort(vector<int>&nums,int low,int high){
if(low>=high) return;
int first=low;
int last=high;
int key=nums[first]; //取数组第一个元素为基准元素
while(first<last){
while(first<last&&nums[last]>=key) last--; //让last从后向前进行查询,直到找到第一个小于key的元素
nums[first]=nums[last]; //把首指针数组用尾指针数组替换
while(first<last&&nums[first]<=key) first++; //让first从前向后进行查询,直到找到第一个大于key的元素
nums[last]=nums[first]; //把尾指针数组用首指针数组替换
}
nums[first]=key; //基准元素归位
quicksort(nums,low,first-1); //递归调用对基准左边的数组排序
quicksort(nums,first+1,high); //递归调用对基准右边的数组排序
}
int main(){
int n,temp;
cin>>n;
vector<int>nums;
while(n--){
cin>>temp;
nums.push_back(temp);
}
quicksort(nums,0,nums.size()-1);
for(int i=0;i<nums.size();i++){
cout<<nums[i]<<" ";
}
cout<<endl;
return 0;
}
方法二:
#include <iostream>
#include <vector>
using namespace std;
void quicksort(vector<int>&nums,int low,int high){
if(low>=high) return;
int first=low;
int last=high;
int key=nums[first]; //取数组第一个元素为基准元素
while(first<last){
while(first<last&&nums[last]>=key) last--; //让last从后向前进行查询,直到找到第一个小于key的元素
swap(nums[first],nums[last]); //交换首尾指针指向的数组
while(first<last&&nums[first]<=key) first++; //让first从前向后进行查询,直到找到第一个大于key的元素
swap(nums[first],nums[last]); //交换首尾指针指向的数组
}
quicksort(nums,low,first-1); //递归调用对基准左边的数组排序
quicksort(nums,first+1,high); //递归调用对基准右边的数组排序
}
int main(){
int n,temp;
cin>>n;
vector<int>nums;
while(n--){
cin>>temp;
nums.push_back(temp);
}
quicksort(nums,0,nums.size()-1);
for(int i=0;i<nums.size();i++){
cout<<nums[i]<<" ";
}
cout<<endl;
return 0;
}
区别:
这两种实现方法的微小区别在于,前者需要基准元素归位,而后者不用;前者通过首尾指针相互替换交换,而后者直接交换。
注意:
动态数组参数需要加引用,否则不会改变;while循环中判断条件要带上等号,不然数字重复会死循环;如果要举例,随便自己找几个数在纸上按步骤一步一步画一下就出来了;其实基准元素可以任意,为了方便取第一个。