快速排序
思想
快排的核心思想便是分治,分治是将一个比较复杂庞大的问题分化成一个一个比较简单的子问题来分别处理的一种解题思路。
确定一个分界点,使得左边的数小于等于分界点,右边的数大于等于分界点。使得待排序列有序化。然后分别对左右子序列进行相同的操作,直到完成排序为止。
1. 确定分界点
2. 调整范围
3. 递归处理左右俩子段
算法描述
1、确定函数的结束条件(即当数组元素只有一个或者没有元素,那就结束递归)。
2、确定分界点(一般情况是以左边第一个的值为分界点,即q,当然以任意方式选取分界点都是可以的)。
3、调整范围,使得右半边的数都大于等于分界点值,左半边的数都小于等于分界点的值
4、重复执行1~3(递归)操作,直到完成排序
模板
void quickSort(int q[], jnt l, int r)
{
//递归结束条件
if (1 >= r) return;
//确定分界点
int x=q[l], 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]);
}
//递归
quickSort(q, l, j);
quickSort(q, j + 1, r);
}
归并排序
思想
和快排一样,归并排序同样运用了分治的思想。不过和快排不同,归并排序,是先递归(微分),再将有序的子序列逐渐的合二为一(积分),借此实现对数组的排序。
1.确定分界点 mid=(1+r)/2
2.递归排序 均匀分成左右两半分别递归
3. 归并一合二为一
算法描述
1、先确定分界点,由于归并都是均匀的分为两部分,所以说分界点都是取(l+r)/2。
2、[l,mid]、[mid+1,r]根据这个规则不断的对左右子序列进行递归排序。
3、反过头进行比较合并的操作,即归并,将子序列一点点合并起来,最终便可以得到一个有序的数组。
模板
void mergeSort(int q[], int l, int r)
{
//递归结束条件
if (l >= r) return;
//确定分界点
int mid=l+r>>1;
//递归
mergeSort(q, 1, mid), mergeSort(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=1, j=0;i<= r; i++,j++)
{
q[i]= temp[j];
}
}