排序——快速排序QuickSort

快速排序

应用场景

利用这个思想分割数组

核心思想

是冒泡排序的升级版
找一个标准值,将比标准值小的均放在其左侧,比标准值大的分别放在其右侧,左右两部分分别这么做(分治)

实现方法(根据找标准值方法分类)
挖坑填补法

第一个作标准值,从后向前找小的,从前向后找大的,左右相遇标准值入坑,加入递归方式

小区间扩张法

把小的取出,大的自然剩下,区间分割,分为小区间和大区间

小区间分割最后一个当标准值,找比标准值小的值,和小区间的下一个交换,之后小区间扩张

优化思想
  1. 标准值的选取——避免小概率事件
    1. Rand在区间内随即三次——>选择中间值
      2)直接选固定位置用来替换 向前中后去中间值
      3)可以9选一
  2. 标准值重复问题——把重复的值放到一起
  3. 数组内元素少——插入排序优化
  4. 系统异常的优化——如栈区空间不足
    循环加栈

代码

挖坑填补法

汇编语句会复杂一些

#include<stdio.h>
#include<stdlib.h>
/*快速排序*/
int FindStandNum(int arr[],int left,int right)
{
	int low = left;
	int high = right;
	int Temp = arr[left];//保存标准值
	//挖坑填补法
	while(left < right)
	{
		while(left < right)
		{//从后向前找比标准值小的值
			if(arr[right] < Temp)
			{
				//放到前面的坑中
				arr[left] = arr[right];
				left ++;
				break;
			}
			right --;
		}
		while(left < right)
		{//从前向后找比标准值大的值
			if(arr[left] > Temp)
			{
				arr[right] = arr[left];
				right --;
				break;
			}
			left ++;
		}
	}
	//添坑
	arr[left] = Temp;//标准值放到对应位置
	return left;
}
void MyQuickSort(int arr[],int left,int rigth)
{
	if(arr == NULL || left >= rigth) return;
	int pTemp = FindStandNum(arr,left,rigth);
	// 分割成两部风,分别重复以上操作
	MyQuickSort(arr,left,pTemp-1);
	MyQuickSort(arr,pTemp+1,rigth);

}
void QuickSort(int arr[],int nlength)
{
	int left = 0;
	int rigth = nlength-1;
	MyQuickSort(arr,left,rigth);
}

小区间扩张
int FindStantNum1(int arr[],int left,int right)
{
	int minFlags = left - 1; // 标记小区间最后一个元素
	int Temp = arr[right];
	for(left;left < right ; left ++)
	{
		if(arr[left] < Temp)
		{
			minFlags ++; // 满足条件区间就扩张
			if(minFlags != left) // left 不再区间中就发生交换
			{
				arr[minFlags] = arr[minFlags]^arr[left];
				arr[left] = arr[minFlags]^arr[left];
				arr[minFlags] = arr[minFlags]^arr[left];
			}
		}
	}
	minFlags = minFlags + 1; // 先加扩张
	//放入标准值
	if(arr[minFlags] !=arr[ right])
	{
			arr[minFlags] = arr[minFlags]^arr[right];
			arr[right] = arr[minFlags]^arr[right];
			arr[minFlags] = arr[minFlags]^arr[right];
	}
	return minFlags;

}
void MyQuickSort(int arr[],int left,int rigth)
{
	if(left >= rigth ||  arr == NULL)
	{
		return;
	}
	int pTemp;
	pTemp = FindStantNum1(arr,left,rigth);

	MyQuickSort(arr,left,pTemp-1);

	MyQuickSort(arr,pTemp+1,rigth);

}
void QuickSort(int arr[],int nlength)
{
	int left = 0;
	int rigth = nlength-1;
	MyQuickSort(arr,left,rigth);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老黑675

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值