侧边栏壁纸
博主头像
xiaoming博主等级

累死自己,卷死别人,为了小刘而努力!!!

  • 累计撰写 24 篇文章
  • 累计创建 7 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

十大经典排序算法之四--快速排序

Administrator
2024-11-13 / 0 评论 / 0 点赞 / 7 阅读 / 3890 字 / 正在检测是否收录...

1、快速排序概念

快速排序( quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

设要排序的数组是A[0]…A[n-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。

2、算法描述

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

3、动画演示

4、过程实例

举个栗子详细的说明一下:下面序列

img

把第一位57作为基准位,用变量把它存起来,因为一会就没了

  • 把所有比57小的数放在57的左面,把比57大的数放在57的右面
  • 两边同时进行,左边找大的,右边找小的,把小的放左边,大的放右边,具体操作如下:

第一趟:从指针j开始,24小于57,放到左边,把57覆盖掉

img

之后:指针i右移,指向68,68>57,放到右边

img

之后:指针j左移指向33,33<57,放到左边

img

之后:指针i右移指向59,59>57,放右边

img

之后:指针j左移指向96,96>57,j再左移指向28,28<57,放左边

img

之后:指针i右移指向52,52<57,i继续右移指向72,72>57,放右边

img

之后:指针j左移,与指针i重合指向NULL,这时放入57

img

这时发现左边的数都比57小,右边都比57大

然后再对57左边的数,即:0到i-1进行快速排序(同样操作,把24作为基准,左边小,右边大),对57右边的数,即:i+1到n进行快速排序(以72位基准,左边小,右边大)直到不能再进行排序为止;

5、算法实例

#include "stdio.h"

void quick_sort(int* arr,int start, int end)
{
	int temp = arr[start];
	if (start >= end)
		return;

	int i = start, j = end;

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

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

void print(int* arr, int e)
{
	for (int i = 0; i < e; i++)
	{
		printf("%d ", arr[i]);
	}
}

int main()
{
	int arr[10] = { 25,8,79,5,4,15,3,88,14,56 };

	quick_sort(arr, 0, 9);
	print(arr, 10);

	return 0;
}
0

评论区