数据结构_快速排序

快速排序的核心思想:

就是选择一个参考值key(一般是第一个元素),将key通过快速排序逻辑放在一个左边都是比他小的数且右边都是比他大的数的位置上,具体实现思路如下:

  1. 定义begin和 end 两个哨兵分别在队头和队尾,用 i 和 j 记录头尾移动坐标;i++ 过程中发现比 key大的元素、end-- 过程中发现比key小的元素停下,交换arr[i] arr[j]值,然后继续相向而行;

  2. 直至 i >= j 停止; 这时 交换 key 和arr[i];此时的key 左边全是比他小的且右边全是比他大的,它的位置就此固定!

  3. 以上是单趟的情况;那么整体如果排序呢?

  4. 运用递归的思路,通过第一趟已经确定了一个知道自己位置的数,这个数也将整个数组划分楚河汉界,左侧 区间(begin ~ i );右侧 区间 (i+1 ~ end);

  5. 如果在左侧调用快速排序函数, 那么(begin ~ i )区间必然也会为首元素选择出一个它的位置,并划分区间,它的右侧依然是i+1 ~ end;这里的end就是 i , i+1 就是 选出的元素位置的下一个;是不是就又开始重复套娃了,左边套完,接着去右边 直至数组左侧全部有序之后,开始右侧,右侧来一趟又会划分左右,这时继续调用我们的左右快速函数即可。

  6. 所有,冗余的话说了这么多,归根结底就是 按照左右区间,重复调用这个函数;另外递归的终止条件为,begin >= end;

#include<stdio.h>

void QuickSort(int* arr, int begin, int end);

void swap(int* p1, int* p2) {
	int tem = *p1;
	*p1 = *p2;
	*p2 = tem;
}
void print(int* p3 , int sz) {
	for (size_t i = 0; i < sz; i++)
	{
		printf("%d ",p3[i]);
	}
}
void main() {

	//单趟情况
	int arr[10] = {6,1,2,7,9,3,4,5,10,8};
	//定义开始和结束下标
	int begin = 0;
	int n = sizeof(arr) / sizeof(int);
	int end = n-1;
	QuickSort(arr,begin,end);
	print(arr , n);
}

void QuickSort(int* arr,int begin,int end) {

	if (begin >= end) {
		return;
	}

	int i = begin;
	int key = arr[begin];
	int j = end;
	
	while (i != j) 
	{
		//找到值,停下J
		while (arr[j]>key && j > i)
		{
			j--;
		}
		//找到值,停下I
		while (arr[i] <= key && j > i)
		{
			i++;
		}
		//交换 arr[i] arr[j]
		swap(&arr[i],&arr[j]);
	}
	//相遇
	swap(&arr[i], &arr[begin]);

	//i这个点的值 确定好了;
	
	//关注i左 和i右
	QuickSort(arr, begin, i-1);
	
	QuickSort(arr, i+1 , end);

	}

单趟结果:
在这里插入图片描述
可以发现 首元素 6 左侧全是比他小的 && 右侧全是比他大的 ;

整体测试结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值