快速排序
快速排序是利用的分治的思想,将一段用一个点x分为两块,满足在x的左边都<=x,满足在x的右边都>x 除了分治的思想,还利用了双指针,在整个序列的前面和后面都设置一个指针,每次现将前指针往后走判断是否满足<=x,若满足,则继续往后走,直到不满足条件,则后指针往前移动,也找到第一个不满足>x的,然后前指针和后指针所指的数据进行交换,直到前后指针相遇,后面就是分治的思想
void quick_sort(ll q[],ll l,ll r)
{
if(l>=r) return ;
ll x=q[l+r>>1],i=l-1,j=r+1;
while(i<j)
{
do ++i;while(q[i]<x);
do --j;while(q[j]>x);
if(i<j)
swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
归并排序
归并排序跟快速排序有些许不同,归并排序运用了二分的思想和双指针,将一段分为两段,并且继续二分下去,当分到最后一层(单个一定是有序的)之后再将两段合并,然后返回上层,然后运用双指针分别指向两端的开头,进行比较,将小的放到临时数组中,然后指针后移,直到两端的元素都放到临时数组中,对于连续的两段,临时数组中保存的就是这两段排完序的所有元素,所以再将临时数组里的元素对其进行赋值即可;
int q[],temp[];
void morge_sort(int q[],int l,int r)
{
if(l>=r) return;
int mid=l+r>>1;
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j])temp[k++]=q[i++];
else temp[k++]=q[j++];
}
while(i<=mid)temp[k++]=q[i++];
while(j<=r)temp[k++]=q[j++];
for(i=l,j=0;i<=r;i++)
q[i]=temp[j++];
}
|