快速排序模板
快速排序的思想是分治:
定义两个指针,i,j,若 i 指向的数值小于x,则 i 向后移动一位,直到 i 指向的数大于等于 x 停止移动;同理,若 j 指针指向的数值大于x,则 j 指针向前移动一位,直到 j 指向的数小于等于 x 停止移动;两个指针都停止移动时,交换指针指向的数值...
算法思想可参考下图:
需要注意的是:如果分界点取x = q[l] 或者x = q[r], 即当取两段最坏情况为n方复杂度,在一些oj上会出现超时的情况
#include<iostream>
#include<algorithm>
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;
//如果分界点取x = q[l]或者x = q[r],取两段最坏情况n方复杂度,在一些oj上会出现超时的情况
//i = l - 1,j = r + 1,而不是使指针正好指到首尾两端,暂时记住即可
int x = q[(l + r) / 2],i = l - 1,j = r + 1;
while (i < j)
{
//只要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;
}
归并排序模板:
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int q[N],temp[N];
int n;
void merge_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 i = l,j = mid + 1;
int k = 0;
//i可以移动到mid的位置,j可以移动到r的位置
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++];
//将结果返回给q数组
for (int i = l,j = 0;i <= r;i++,j++) q[i] = temp[j];
}
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;
}
可参考上图理解归并排序代码