快速排序的实现

一般我们在对数据进行排序时都采用冒泡排序法,然而冒泡排序算法中在对数据进行遍历一遍时,只能排序一个数据到正确的位置上去,其算法的时间复杂度为o(n^2),该算法的效率比较低,而快速排序算法是在冒泡排序的基础上提出的快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:
1、在一组比较的数据中取一个数为基准数。
2、通过对基准数与其它数据比较,将大于基准数的数据放到基准数的右边,反之小于基准数的数据放到左边。
3、然后在以基准数为界限的两部分数据进行递归,依次使整个数据变成有序序列。
其中这种快速排序的思想可以看成:挖坑填数+分治法。

挖坑填数法如图所示:
在这里插入图片描述
首先选定数组第一个数据作为基准值。将其保存在temp变量中,在此处挖坑等待小于基准值的数据填入,然后开始第一步重右向左比较哪个数据小于基准值,则将该数填入到该坑出,第二步因为第一次重右找到小于基准值使数据43,且上次又在该处挖坑,因此接下来应该重左向右找大于该基准值的数,放入到该坑处,如下图所示。
在这里插入图片描述
当所有数据比较完后,则数据会排序成以基准值为中心,左边都是小于基准值的数据,右边都是大于基准值的数据。如下图所示
在这里插入图片描述
2、分治法:就是在将原数组的长度以基准值为界限划分为2个无序数组,在对这两个数组重新排序重复以上过程,最后都使整个数组都变成有序排列。

void quick_sort(int* arr,int begin,int end)
{
	int i = begin;
	int j = end;
	int temp = arr[begin];

	if (begin < end)
	{
		while (i < j)
		{
			while (i<j&&arr[j]>temp)
			{
				j--;
			}

			if (i < j)
			{
				arr[i] = arr[j];
			}
			while (i < j&&arr[i] < temp)
			{
				i++;
			}

			if (i < j)
			{
				arr[j] = arr[i];
			}
		}

		arr[i] = temp;
		quick_sort(arr, begin, i - 1);
		quick_sort(arr, i + 1, end);

	}
	else
		return;
}
int main()
{
	int arr[10] = { 72,6,57,88,60,42,83,73,43,85 };
	int i = 0;
	int len = sizeof(arr) / sizeof(arr[0]) - 1;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	quick_sort(arr,0,len);
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

程序运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值