快速排序模板
快速排序——分治思想
在之前的文章已經介紹了兩者的定義及基本思想,可以看這裏十大基本排序
下面是排序排序模板的基本步驟和思想。、
|——————————————|
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;
}