排序方式
快排
class Solution {
int sort(vector<int>& nums,int left,int right)
{
int pivot=rand()%(right-left+1)+left;
int temp=nums[left];
nums[left]=nums[pivot];
nums[pivot]=temp;
pivot=nums[left];
while(left<right)
{
while(left<right&&nums[right]>=pivot)
right--;
nums[left]=nums[right];
while(left<right&&nums[left]<=pivot)
left++;
nums[right]=nums[left];
}
nums[left]=pivot;
return left;
}
void quick_sort(vector<int>& nums,int left,int right)
{
if(left>=right)
return;
int mid=sort(nums,left,right);
quick_sort(nums,left,mid-1);
quick_sort(nums,mid+1,right);
}
public:
vector<int> sortArray(vector<int>& nums) {
quick_sort(nums,0,nums.size()-1);
return nums;
}
};
归并
class Solution {
public:
vector<int>temp;
void merge(int l,int r,vector<int>& nums){
int mid = l + (r-l)/2;
int i = l,j = mid+1;
int cnt = 0;
while(i <= mid && j <= r){
if(nums[i] <= nums[j]){
temp[cnt++] = nums[i++];
}else{
temp[cnt++] = nums[j++];
}
}
while(i <= mid){
temp[cnt++] = nums[i++];
}
while(j <= r){
temp[cnt++] = nums[j++];
}
for(int k = 0;k <= r-l;++k){
nums[l+k] = temp[k];
}
}
void merge_sort(int l,int r,vector<int>& nums){
if(l >= r) return;
int mid = l + (r-l)/2;
merge_sort(l,mid,nums);
merge_sort(mid+1,r,nums);
merge(l,r,nums);
}
vector<int> sortArray(vector<int>& nums) {
temp.resize(nums.size(),0);
merge_sort(0,nums.size()-1,nums);
return nums;
}
};
堆排序
class Solution {
public:
void build_head(vector<int>& nums,int index,int len){
int temp = nums[index];
for(int k = 2*index+1;k < len;k = 2*k+1){
if(k+1<len && nums[k] < nums[k+1]){
k++;
}
if(nums[k] > temp){
nums[index] = nums[k];
index = k;
}else{
break;
}
}
nums[index] = temp;
}
void head_sort(vector<int>& nums){
int len = nums.size();
for(int i = len/2-1;i>=0;--i){
build_head(nums,i,len);
}
for(int i = len-1;i > 0;i--){
swap(nums[i],nums[0]);
build_head(nums,0,i);
}
}
vector<int> sortArray(vector<int>& nums) {
head_sort(nums);
return nums;
}
};