排序算法总结(二)——快速排序、归并排序

本文详细介绍了两种常用的排序算法——快速排序和归并排序。快速排序通过一趟排序将数据分割成独立的两部分,并递归进行排序;归并排序则是将待排序序列分为若干个有序子序列,然后合并成整体有序序列。文章提供了具体实例和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序

排序思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。其中,个人认为如何将数据按key排放这一步骤最为重要,理解了这里,整个算法应该就明白了。

排序实例:49 38 65 97 76 13 27

进行第一次交换后:27 38 65 97 76 13 49           ( 按照算法的第三步从后面开始找,此时:J=6)
进行第二次交换后:27 38 49 97 76 13 65           ( 按照算法的第四步从前面开始找>key的值,65>49,两者交换,此时:I=2 )
进行第三次交换后:27 38 13 97 76 49 65           ( 按照算法的第五步将又一次执行算法的第三步从后开始找
进行第四次交换后:27 38 13 49 76 97 65           ( 按照算法的第四步从前面开始找大于key的值,97>49,两者交换,此时:I=3,J=5 )
此时再执行第三和四步的时候就发现I=J=4,从而结束一趟快速排序,那么经过一趟快速排序之后的结果是:27 38 13 49 76 97 65,即所有大于key49的数全部在49的后面,所有小于key(49)的数全部在key(49)的前面。

是否稳定:否。

时间复杂度:平均时间复杂度Ο(n log n) ,最坏为O(n^2)。

void swap(int *pLeft,int *pRight)
{
	int temp;
	temp = *pLeft;
	*pLeft= *pRight;
	*pRight = temp;
}

void my_quick_sort(int a[], int begin, int end)
{
	int compare=a[begin], left =begin,right = end;
	if(left > right)
	    return;

	while(left < right)
	{
		while ((left < right) && (a[right] >= compare))
			right--;
		swap(&a[left], &a[right]);
		while ((left < right) && (a[left] <= compare))
			left++;
		swap(&a[left], &a[right]);
	}

	my_quick_sort(a, begin, left-1);
	my_quick_sort(a, left+1, end);
}


归并排序

排序思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

是否稳定:稳定。

时间复杂度:O(n*logn)。

void mergearray(int a[], int first, int mid, int last, int temp[])
{
	int i = first, j = mid + 1;
	int m = mid,   n = last;
	int k = 0;
	
	while (i <= m && j <= n)
	{
		if (a[i] <= a[j])
			temp[k++] = a[i++];
		else
			temp[k++] = a[j++];
	}
	
	while (i <= m)
		temp[k++] = a[i++];
	
	while (j <= n)
		temp[k++] = a[j++];
	
	for (i = 0; i < k; i++)
		a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
	if (first < last)
	{
		int mid = (first + last) / 2;
		mergesort(a, first, mid, temp);    //左边有序
		mergesort(a, mid + 1, last, temp); //右边有序
		mergearray(a, first, mid, last, temp); //再将二个有序数列合并
	}
}
bool MergeSort(int a[], int n)
{
	int *p = new int[n];
	if (p == NULL)
		return false;
	mergesort(a, 0, n - 1, p);
	delete[] p;
	return true;
}


注:文中部分代码参考了其他博文。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值