1、堆排序
升序数组
class Solution {
public:
vector<int>sortArray(vector<int>nums)//整体调用
{
int len = nums.size();
int a[len+1];
for(int i=0;i<len;i++) a[i+1]=nums[i];
for(int i=len/2;i>=1;i--) sink(a,i,len);
int k=len;
while(k>1)
{
swap(a,1,k--);
sink(a,1,k);
}
for (int i = 1; i < len+1; ++i) {
nums[i-1] = a[i];
}
return nums;
}
void swap(int *num,int i,int j)//交换操作
{
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
void sink(int *nums,int k,int end)//下沉操作(大根堆)
{
while(2*k<=end)
{
int j=2*k;
if(j+1<=end && nums[j+1] > nums[j]) j++;
if(nums[j]>nums[k]) swap(nums,j,k);
else break;
k=j;
}
}
};
降序数组
class Solution {
public:
vector<int>sortArray(vector<int>nums)//整体调用
{
int len = nums.size();
int a[len+1];
for(int i=0;i<len;i++) a[i+1]=nums[i];
for(int i=len/2;i>=1;i--) sink(a,i,len);
int k=len;
while(k>1)
{
swap(a,1,k--);
sink(a,1,k);
}
for (int i = 1; i < len+1; ++i) {
nums[i-1] = a[i];
}
return nums;
}
void swap(int *num,int i,int j)//交换操作
{
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
void sink(int *nums,int k,int end)//下沉操作(大根堆)
{
while(2*k<=end)
{
int j=2*k;
if(j+1<=end && nums[j+1] <nums[j]) j++;
if(nums[j]<nums[k]) swap(nums,j,k);
else break;
k=j;
}
}
};
2、快速排序
- 首先是如果没有在每次运行中加入
i<=j
这个条件,会造成栈溢出,原因在于i和j交错而过,
例子
[5,1,1,2,0,0]
2、另外判断的条件必须是:
nums[i]<x
不可以带等号‘=!!!
代码
class Solution {
public:
void swap(vector<int>&nums,int i,int j)
{
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
void quick_sort(vector<int>&nums,int l,int r)
{
if(l>=r) return;
int x=nums[(l+r)/2],i=l-1,j=r+1;
while(i<j)
{
do i++; while(nums[i]<x&&i<=j);
do j--; while(nums[j]>x&&i<=j);
if(i<j) swap(nums,i,j);
}
quick_sort(nums,l,j);
quick_sort(nums,j+1,r);
}
vector<int> sortArray(vector<int>& nums) {
quick_sort(nums,0,nums.size()-1);
return nums;
}
};
3、归并排序:
代码
class Solution {
vector<int>temp;
void merge_sort(vector<int>&nums,int l,int r)
{
if(l>=r) return;
int mid=(l+r)>>1;
merge_sort(nums,l,mid);
merge_sort(nums,mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r)
{
if(nums[i]<nums[j])
{
temp[k++]=nums[i++];
}
else
{
temp[k++]=nums[j++];
}
}
while(i<=mid) temp[k++]=nums[i++];
while(j<=r) temp[k++]=nums[j++];
for(i=0;i<k;i++)
nums[i+l]=temp[i];
}
public:
vector<int> sortArray(vector<int>& nums) {
temp.resize((int)nums.size(),0);
merge_sort(nums,0,(int)nums.size()-1);
return nums;
}
};
resize函数是重新分配空间函数,第一个参数时重新分配空间的大小 第二个参数时填充的元素值。
易错易混的代码,当时也疑惑:
最初写法:
for(i=0;i<k;i++) num[i]=temp[i];
当时也疑惑 这样每次前面的元素不都被覆盖了吗?
正确写法:
for(i=0;i<k;i++) num[i+l]=temp[i];
这样起步就是从l开始的
4、冒泡排序
代码
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(nums[j]>nums[j+1])
{
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
return nums;
}
};
5、计数排序
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
int n=nums.size();
int max=0x3f3f3f,min=-0x3f3f3f;
for(int i=0;i<n;i++)
{
if(nums[i]>max) max=nums[i];
else if(nums[i]<min) min=nums[i];
}
vector<int>count(max-min+1,0);
for(int i=0;i<n;i++)
count[nums[i]-min]++;
int k=0;
for(int i=0;i<max-min+1;i++)
while(count[i]--)
{
nums[k++]=i+min;
}
return nums;
}
};