算法竞赛中常用的排序算法

1.快速排序(Quick sort)

💡 时间复杂度: N ∗ l o g N N*log N NlogN

(a)快速排序算法实现方式:

快速排序的核心思想是分治法,分而治之。它的实现方式是每次从序列中选出一个基准值,其他数依次和基准值做比较,比基准值大的放右边,比基准值小的放左边,然后再对左边和右边的两组数分别选出一个基准值,进行同样的比较移动,重复步骤,直到最后都变成单个元素,整个数组就成了有序的序列。

快速排序算法图解

(b)算法描述:

快速排序是使用分治的方法将一个串分为两个子串,然后递归的方法继续划分,具体算法描述如下:

  • 定义两个指针L和R分别指向序列的两端。
  • 从序列中挑选一个指针元素P,称为 “基准”(pivot)
  • 一般选 P = ( L + R ) / 2
  • 分区操作:重新排序序列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
    [ 比基准值小的数] 基准值P [ 比基准值大的数]
  • 接着,对两个“[ ]”中的数据进行排序之后,整体的排序便完成了。对“[ ]”里面的数据进行排序时(递归排序左右两边“[ ]”中的子序列)同样也会使用快速排序。

快速排序代码模板:

//快速排序模板
void quick_sort(int q[], int l, int r)
{
	if(l >= r) return;//如果l >= r则数列只有一个数或数列为空
	
	int i = l - 1, j = r + 1, x = q[(l + r) >> 1];//定义双指针,i指向左端,j指向右端,x为数列的基准值
	while(i < j)
	{
		//将小于x的数放在x的左边,大于x的数放在x的右边
		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);//递归右边

}

归并排序(Merge sort)

💡 时间复杂度: N ∗ l o g N N* log N NlogN

(a)快速排序算法实现方式:

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的

在这里插入图片描述

(b)算法描述:

  • 定义三个指针 L, R, mid, 分别指向序列的左右两端和中间。
  • 首先找到序列的中间值mid =( L + R) / 2,将序列分为两个子序列。
  • 对左序列( L — mid)和右序列 ( mid + 1— R )递归将序列划分成若干个子序列。
  • 然后从下往上逐层合并,首先对第一层序列的数字进行排序合并,然后再依次排序合并各层。

快速排序代码模板:

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 k = 0, i = l, j = mid + 1;//***
	while (i <= mid && j <= r)//比较两个数,将较小的数存入tmp[]数组中
	    if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
	    else tmp[k ++ ] = q[j ++ ];
	//将比较厚剩余的数加到数组的后面
	while (i <= mid) tmp[k ++ ] = q[i ++ ];
	while (j <= r) tmp[k ++ ] = q[j ++ ];
	//将tmp[]数组中的值搬回q[]数组中
	for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值