超實用的快排、歸併排序小模板(建議背會喲)

快速排序模板

快速排序——分治思想

在之前的文章已經介紹了兩者的定義及基本思想,可以看這裏十大基本排序

下面是排序排序模板的基本步驟和思想。、
|——————————————|
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章