排序算法–快排的优化

下面是我写的一种快排:

#include <iostream>
#include <stdlib.h>using namespace std;void Print(int arr[],int len)
{int i=0;for(i;i<len;i++){cout<<arr[i]<<" ";}cout<<endl;
}
int Parition(int arr[],int first,int end)
{int key=arr[first];while(first<end){while(first<end && arr[end]>=key){end--;}if(first<end){arr[first]=arr[end];}while(first<end && arr[first]<=key){first++;}if(first<end){arr[end]=arr[first];}}arr[first]=key;return first;
}
void Quick(int arr[],int first,int end)
{int k;if(first<end){//最少有两个数据//找寻基准点k=Parition(arr,first,end);Quick(arr,first,k-1);Quick(arr,k+1,end);}
}
void QuickSort(int arr[],int len)
{if(arr==NULL || len<1){return;}//快速排序就是找基准点的位置//将基准点大的数字放在基准点右,反之为左边Quick(arr,0,len-1);
}int main()
{int arr[]={12,45,11,12,20,1,5,4,30,2,9};int len=sizeof(arr)/sizeof(int);Print(arr,len);QuickSort(arr,len);Print(arr,len);return 0;
}

我们从示例中发现,要是数组越趋于有序呢,那么我们递归的次数越来越多导致开销特别大,每次的遍历都循环遍历数组;

针对快排优化一:

  • 之前我们采用的基准数是数组的第一位,所以如果数组是有序数组的话,我们可以随机选取基准点,合理的利用rand()函数,
 - Swap(arr,first,rand()%(end-first+1)+first);//将随机值放入第一位

针对快排优化二:
我们还可以采取三数取中法;

int mid=(end-first)/2+first;
getMiddleMaxNum(arr,first,mid,end);
void getMiddleMaxNum(int arr[],int first,int mid,int end)
{if(arr[mid]>arr[end]){Swap(arr,mid,end);//基准点为mid 和 end中较大的数为基准点}if(arr[first]<arr[end]){Swap(arr,first,end);}if(arr[first]>arr[mid]){Swap(arr,first,mid);}
}

针对快排优化三:
快排呢,适用于数据量大的排序,和堆排序是适用的,那么在数据量小和数据量大的分界线处,小直接使用直接插入排序,他最快可以达到o(n);

if((end-first)<20)
{//数据量 直接使用插入排序Insert(arr,first,end);//插入排序最好的情况能达到O(n)的效率return;
}

针对快排优化四;
我们可以使用非递归的方式来实现快排

void Sort(int arr[],int first,int end)
{int* st=(int *)malloc(sizeof(int)*(end-first+1)*2);//开辟对应的空间//int *st=(int *)malloc(sizeof(int)*end);int top=0;st[top++]=first;st[top++]=end;int k;while(top!=0){end=st[top-1];top--;first=st[top-1];top--;k=Parition(arr,first,end);//从右区间开始if(k+1<end){//右区间至少有两个元素st[top++]=k+1;st[top++]=end;}if(first<k-1){//左区间至少有两个元素st[top++]=first;st[top++]=k-1;}}free(st);
}

排序算法--快排的优化相关推荐

  1. 排序算法 | 快排、冒泡、堆排、归并、基数、递归、希尔、计数

    文章目录 写在前面 排序 1. 基数排序`稳定` 2. 归并排序`稳定`merge sort 3. 快速排序`不稳定`quick sort 4. 堆排序`不稳定`heap sort 大根堆 小根堆 5 ...

  2. 经典排序之快排及其优化

    基础快排: int __partition(int arr[], int l, int r) {int v = arr[l];int j = l ;for (int i = l + 1; i < ...

  3. 基于单链表快排的优化算法

    快排大法好,不说日常数据处理的巨大优势,面试时能手写快排更是装X一大利器. 不过传统的快排有一大缺陷:当出现大量相同值或数据已经有序时,由于对相同值的重复递归,排序效率会急剧降低乃至O(N^2). 为 ...

  4. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  5. 快速排序、快排的优化 及Java实现

    一.快速排序的思想 选取一个比较的基准,将待排序数据分为独立的两个部分,左侧都是小于或等于基准,右侧都是大于或等于基准,然后分别对左侧部分和右侧部分重复前面的过程,也就是左侧部分又选择一个基准,又分为 ...

  6. 排序(下)---快排、归并

    排序(下)-快排.归并 快速排序 采用分治的思想:每次选区一个数作为基准,让整个数据中凡是大于此数的放在此数的右边,小于此数的放在此数的左边,然后进行对此数的两边进行选基准,如上方式的分法,递归下去, ...

  7. 八大排序算法之快速排序(下篇)(快排的优化+非递归快排的实现)

    目录 一.前言 1.快速排序的实现: 快速排序的单趟排序(排升序)(快慢指针法实现):​ 2.未经优化的快排的缺陷 二.快速排序的优化 1.三数取中优化 优化思路: 2. 小区间插入排序优化 小区间插 ...

  8. 02_Python算法+数据结构笔记-冒泡排序-选择排序-插入排序-快排-二叉树

    b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili 文章目录 #11 排序介绍 #12 冒泡排序介绍 #13 冒泡排序 #14 选择排序 #15 插入 ...

  9. 编程算法总结(冒泡排序,选择排序,快排)

    项目需要,自己上学的时候接触过一些算法,我记得当时算法那门考了系里最高分,98分,想着没什么用呢,谁知道这两天就用到了,项目中涉及到了排序,我就重温了一下算法,说到算法,就我个人而言,第一就是想到了冒 ...

最新文章

  1. MySQL5.5加主键锁读问题
  2. Uva 11077 Find the Permutation
  3. 接口本地正常服务器报500_运维该如何解决服务器底层维护难题?
  4. iOS UITableView的使用 (选自oschina)
  5. Arbitrage(判断正环 spfa写法)
  6. excel html modify,Modify excel cell
  7. Python之类的构造(面向对象)
  8. 无线信号的调制方式 OOK、ASK、FSK、GFSK
  9. 2021 年产品沉思录精选集 PDF 下载及卷首语合集:像农夫一样耕耘和等待
  10. 2016新网商年度盛典,千机网解构新零售
  11. python 化学_Python趣用—配平化学方程式!
  12. php提交道不同,【后端开发】php引用和拷贝的区别
  13. 已解决 vmware 虚拟机安装后没有虚拟网卡问题
  14. C# 数组增加元素_C#教程推荐
  15. 2016-HitCon-Pwn-house_of_orange学习(附赠FSOP基础知识)
  16. Windows远程桌面出现CredSSP加密数据修正问题解决方案
  17. 避障机器人程序c语言,移动机器人的避障实验设计+源程序+流程图.doc
  18. 星起航:抖音正在快速分割传统电商平台的市场份额
  19. 中国电子设计自动化(EDA)软件行业未来发展趋势与投资前景分析报告22022-2028年版
  20. Java面向对象程序思想

热门文章

  1. C# QRCode自定义二维码大小
  2. java高德点到ian距离,高德地图(点到线段的最短距离算法)不调用高德API
  3. 微信或企业微信实现扫码登录的三种方式
  4. uC/OS-III系统移植STM32F103C8
  5. YuKimCai——Linux(centos操作系统)挂盘记录
  6. 【MySQL入门指北】第六篇 按条件筛选
  7. 反弹socks代理。
  8. 想从事次世代游戏角色建模,该如何学好人体和五官的雕刻?
  9. 5G发展面临窘境,5G手机销量环比下滑,手机企业对5G热情降温
  10. 襄阳教育云平台实名认证_襄阳教育云平台登录入口下载|襄阳教育云平台手机版登录入口 V3.8.7-清风安卓软件网...