快速排序
应用场景
利用这个思想分割数组
核心思想
是冒泡排序的升级版
找一个标准值,将比标准值小的均放在其左侧,比标准值大的分别放在其右侧,左右两部分分别这么做(分治)
实现方法(根据找标准值方法分类)
挖坑填补法
第一个作标准值,从后向前找小的,从前向后找大的,左右相遇标准值入坑,加入递归方式
小区间扩张法
把小的取出,大的自然剩下,区间分割,分为小区间和大区间
小区间分割最后一个当标准值,找比标准值小的值,和小区间的下一个交换,之后小区间扩张
优化思想
- 标准值的选取——避免小概率事件
- Rand在区间内随即三次——>选择中间值
2)直接选固定位置用来替换 向前中后去中间值
3)可以9选一
- Rand在区间内随即三次——>选择中间值
- 标准值重复问题——把重复的值放到一起
- 数组内元素少——插入排序优化
- 系统异常的优化——如栈区空间不足
循环加栈
代码
挖坑填补法
汇编语句会复杂一些
#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);
}