快速排序使用了分治的思想,不过它和归并排序的差异在于,归并排序是直接每次从中间分开数组然后两边分别排序,而快速排序的思想是把数组arr[f]~arr[e]分为两个子数组arr[f]~arr[r-1]和arr[r+1]~arr[e],arr[f]~arr[r-1]都是小于arr[r]的元素,而arr[r+1]~arr[e]都是大于arr[r]的元素,每次分完之后再继续对左右的数组分别进行快速排序,这样就可以最终获得正确排序的数组了。
分离数组的函数(这个函数既可以把数组元素分开左大右小,同时也可以起到交换排序的作用)
最终返回的下标是把数组分开的下标值
int Partition(vector<int>&arr,int first,int end)
{
int i=first,j=end;
while(i<j){
while(i<j&&arr[i]<=arr[j])j--;
if(i<j){
int temp=arr[i];arr[i]=arr[j];arr[j]=temp;
i++;
}
while(i<j&&arr[i]<=arr[j])i++;
if(i<j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
return i;
}
为数组排序的函数
void QuickSort(vector<int>&arr,int first,int end){
int pivot;
if(first<end){
pivot=Partition(arr,first,end);
QuickSort(arr,first,pivot-1);
QuickSort(arr,pivot+1,end);
}
}
#include<vector>
#include<iostream>
using namespace std;
int Partition(vector<int>&arr,int first,int end)
{
int i=first,j=end;
while(i<j){
while(i<j&&arr[i]<=arr[j])j--;
if(i<j){
int temp=arr[i];arr[i]=arr[j];arr[j]=temp;
i++;
}
while(i<j&&arr[i]<=arr[j])i++;
if(i<j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
return i;
}
void QuickSort(vector<int>&arr,int first,int end){
int pivot;
if(first<end){
pivot=Partition(arr,first,end);
QuickSort(arr,first,pivot-1);
QuickSort(arr,pivot+1,end);
}
}
int main() {
vector<int>arr={456,789,4562,159};
QuickSort(arr,0,arr.size()-1);
for(int i=0;i<arr.size();i++)
cout<<arr[i]<<" ";
return 0;
}