分治法 —— 快速排序和归并排序(自底向上和自顶向下)

本文深入探讨了两种高效的排序算法:快速排序和归并排序。详细解释了这两种算法的基本思想、分治策略及其实现代码,通过实例演示了算法的具体运行过程。

问题:

对于给定的含有n个元素的数组a,对其按元素值递增排序。

- 快速排序

1.基本思想:

划分:在待排序的n个元素中任取一个元素(通常取第一个元素)作为基准,把该元素放入最终元素后,整个数据

序列被基准分割成两个子序列,所有小于基准的元素放在前子序列中,所有大于基准的元素放置在后子序列中,并

把基准排在这两个子序列中间。

在这里插入图片描述

2.分治策略:

(1)分解:

将原序列a[s…t]分解成两个子序列a[s … i-1]和a[i+1 … t],其中i为划分的基准位置,即将整个问题划分为两个自问题

(2)求解子问题

若子序列长度为0或1,则它是有序的,直接返回;否则,递归求解各个子问题

(3)合并

由于整个序列存放在有序数组a中,合并不需要其他操作

例:对(2,5,1,7,10,6,9,4,3,8)序列,进行快排

在这里插入图片描述
3.代码

#include<stdio.h>

void disp(int a[],int n){
   
   
	int i;
	for(int i=0;i<n;i++)
	printf("%d ",a[i]);
	printf("\n");
} 
int Partition(int a[],int s,int t){
   
   
	int i=s,j=t;    //i:左指针  j:右指针 
	int tmp=a[s];   //序列的第一个记录作为基准
	while(i!=j){
   
       //从序列两端交替向中间扫描,直到i=j为止 
		while(j>i&&a[j]>=tmp)
		j--;  //从右向左扫描,找到第一个关键字小于tmp的a[j] 
		a[i]=a[j];  //将a[i]前移到a[i]的位置 
		while(i<j&&a[i]<tmp)
		i++;   //从左向右扫描,找到第一个关键字大一tmp的a[i] 
		a[j]=a[i];  //将a[i]后移到a[j]的位置 
	} 
	a[i]=tmp;
	return i;
}

void QuickSort(int a[],int s,int t){
   
   
	if(s<t){
   
   
		int i=Partition(a,s,t);
		QuickSort(a,s,i-1);  //对左子序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值