快速排序
- 寻找基准数
- 交换左右的数字使左边的数字小,右边的数字大
- 以基准数字分割左右区间继续寻找
void q_sort(int x[],int l,int r)
{
if(l>=r)return;
int index=x[(r+l)>>1];
int i=l-1,j=r+1;
while(i<j)
{
do i++;while(x[i]<index);
do j--;while(x[j]>index);
if(i<j)swap(x[i],x[j]);
}
q_sort(x,l,j),q_sort(x,j+1,r);
}
归并排序
- 分治,一个区间变两个区间
- 合并,用一个中间数组来合并两个有序区间,三个while循环,第一个while循环要进行比较两个有序区间。
void b_sort(int x[],int l,int r)
{
if(l >= r)return ;
int index = (l+r) >>1;
b_sort(x,l,index),b_sort(x,index+1,r);
int i = l,j = index+1,k = 0;
while(i <= index && j <= r)
if(x[i] <= x[j]) tmp[k ++ ]=x[i ++ ];
else tmp[k ++ ] = x[j ++ ];
while(i <= index)tmp[k ++ ] = x[i ++ ];
while(j <= r)tmp[k ++ ] = x[j ++ ];
for(int i = l, j = 0; i <= r; i ++, j ++)
x[i] = tmp[j];
}
归并排序求逆序对个数
传送门
class Solution {
public:
int reversePairs(vector<int>& nums) {
int n = nums.size();
vector<int> tmp(n);
return b_sort(nums, tmp, 0, n - 1);
}
int b_sort(vector<int>& x, vector<int> &tmp, int l,int r)
{
int ans = 0;
if(l >= r)return 0;
int index = (l+r) >>1;
ans = b_sort(x, tmp, l, index) + b_sort(x, tmp, index+1 ,r);
int i = l,j = index+1,k = 0;
while(i <= index && j <= r)
if(x[i] <= x[j])
{
tmp[k ++ ]=x[i ++ ];
ans += j - (index + 1);
}
else tmp[k ++ ] = x[j ++ ];
while(i <= index)
{
tmp[k ++ ] = x[i ++ ];
ans += j - (index + 1);
}
while(j <= r)tmp[k ++ ] = x[j ++ ];
for(int i = l, j = 0; i <= r; i ++, j ++)
x[i] = tmp[j];
return ans;
}
};