经典算法 - wenzhoullq/leetcode GitHub Wiki
147. 对链表进行插入排序 冒泡排序
899. 有序队列 类似于冒泡,k >= 2 一定能排列成功
void sort(int left,int right){
if(left>=right) return;
int par = nums[left],i = left ,j = right;
while(i<j){
while(i<j&&nums[j]>=par) j--;
if(i<j){
nums[i] = nums[j];
}
while(i<j&&nums[i]<=par) i++;
if(i<j){
nums[j] = nums[i];
}
}
nums[i] = par;
sort(left,i-1);
sort(i+1,right);
}
215. 数组中的第K个最大元素 topk,快排取一半
归并算法和快排相对,它是自底向上的;与快排相比较,它会需要多一个数组来记录原始位置。
归并有一个经典的运用,就是逆序对,逆序对是针对右边有多少比它大/小的题目,针对逆序对来讲,在i移动的时候,j-mid-1就是逆序对的个数
void sort(pair[] arr,int l,int r){
if(l>=r) return ;
int mid=(l+r)/2;
sort(arr,l,mid);
sort(arr,mid+1,r);
merge(arr,l,r,mid);
}
void merge(pair[] arr,int left,int right,int mid){
for(int i=left;i<=right;i++) temp[i]=arr[i];
int i=left,j=mid+1,index=left;// j=mid+1是非常容易错的点
while(i<=mid||j<=right){
if(i>mid) arr[index++]=temp[j++];
else if(j>right) arr[index++]=temp[i++];
else if(temp[i].val>temp[j].val) arr[index++]=temp[j++];
else arr[index++]=temp[i++];
}
493. 翻转对 逆序对的时候可以在外面做,不容易错