快速排序模板
快速排序——分治思想
在之前的文章已经介绍了两者的定义及基本思想,可以看这里十大基本排序
下面是排序排序模板的基本步骤和思想。、
|——————————————|
l ---------------------------------------- r
1.确定分界点 q[l],q[(l+r)/2],q[r],随机
【分界点是下标或位置】
2.重新调整区间划分成两部分,将小于等于x的放在前一区间,大于等于x的放在后一区间(重难点)
3.递归处理左右两段,
#include<iostream>
using namespace std;
const int N = 1e6+10;
int n;
int q[N];
//快排模板
void quick_sort(int q[], int l, int r)
{
if(l >= 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]); //交换两个数
}
quick_sort(q, l, j); //取左半段筛选
quick_sort(q, j+1, r); //取右半段筛选
//分成两段,继续进行递归
}
int main()
{
scanf("%d",&n);//输入要排序的数字总数
for(int i=0; i < n; i++) scanf("%d",&q[i]);
quick_sort(q, 0, n-1); //整体进行筛选
for(int i =0; i < n; i++) printf("%d ",q[i]);
return 0;
}
归并排序模板
left right
|———————|———————|
1.确定分界点:mid=(l + r)/2 [分解点是数值]
2.递归排序left、reght
3.归并——合二为一(重难点)
#include<iostream>
using namespace std;
const int N = 1000010;
int n ;
int q[N],temp[N];
void merge_sort(int q[], int l, int r)
{
if(l >= r) return;
int mid = l + r >> 1; // 位运算,意为 相加除以2
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++,j++) q[i] = temp[j]; //将temp数组复制给q
}
int main()
{
scanf("%d", &n);
for(int i = 0; i < n ;i ++) scanf("%d",&q[i]);
merge_sort(q, 0, n - 1);//归并排序
for(int i = 0; i < n; i ++) printf("%d ",q[i]);
return 0;
}