快速排序 算法 详解 及 深度优化
下面简介经典算法 快速排序算法 实现及优化。 (欢迎大家指点,继续提出优化的方法,共同提高)
基本思想:(以按从小到大排序为例说明)通过多次的排序,每次的排序均将要排序的数组分为两部分,前一部分均比中间值小,后一部分均比中间值大,这样重复递归下去将每一部分按相同的思路进行分割,最终使整个数组达到从小到大有序排列。
较冒泡排序的优点:同为通过不断的比较和移位来得到有序数组,但快排增大了比较和移动的距离,使关键字大的能从最前移到最后,关键字小的能从叫最后移到最前,从而减少了比较和移动的次数。
关键代码:
int Qsort(int arr[], int low, int high)//len不包括arr[0]
{int pivot;if (low < high){pivot = Partition(arr, low, high);//分成两组Qsort(arr, low, pivot - 1);//数组 low~pivot-1 的元素均比pivot小Qsort(arr, pivot + 1, high); //数组 pivot+1~high 的元素均比pivot大}return 0;
}
int Partition(int arr[], int low, int high)
{int pivot = arr[low];while (low < high){while(low < high && arr[high] >= pivot)high--;swap(arr, low, high);//处理数组的后部分,将比 pivot小的移到前面while(low < high && arr[low] <= pivot)low++;swap(arr, low, high); //处理数组的前部分,将比 pivot大的移到后面} return low;//当low,high指向同一值时退出循环,此时low,high指向pivot
}
int swap(int arr[], int low, int high)
{int temp;temp = arr[low];arr[low] = arr[high];arr[high] = temp;return 0;
}
以上为 基本 快拍算法的实现。可通过下面测试验证:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int array[50] = {0,3,6, 7,6,8,23,46,8,23,75,23,11,84,2,56,32};
int Partition(int arr[], int low, int high);
int Qsort(int arr[], int low, int high);//len不包括arr[0]
int swap(int arr[], int low, int high);int main()
{int i;int len = 20;Qsort(array, 1, len);for (i = 0; i <len; i++){printf("%d ",array[i]);}return 0;
}
复杂度分析:
当选取的pivot为中间值时,递归树是平衡的,此时性能较好。因为分成的两端,在递归划分是能进行最少次数的划分。此时,复杂度为O(logn),而当 最坏的情况,即pivot为最大时,将出现极端情况,此时复杂度为O(n)。具体推到可参考其他资料~
优化:
1.优化选取的枢纽。避免出现极端情况
思想:选多个数,取中间值作为pivot
2.优化不必要的交换
思想:arr[ow] = arr[high] 行,采用替换,而不是交换的方式进行优化。
int Partition(int arr[], int low, int high)
{int pivot = arr[low];while (low < high){while(low < high && arr[high] >= pivot)high--;arr[low] = arr[high];while(low < high && arr[low] <= pivot)low++;arr[high] = arr[low];}arr[low] = pivot; return low;
}
3.优化小数组排序方案
思想:快排适合 数组较大时的排序,较少时不如简单排序。
方案:Qsort()排序对数组大小进行判断,选择适当的排序。
4.优化递归操作
思想:过多递归占用大量堆栈,同时入栈退栈浪费大量时间,改为迭代
int Qsort(int arr[], int low, int high)//len不包括arr[0]
{int pivot;while (low < high){pivot = Partition(arr, low, high);//分成两组Qsort(arr, low, pivot - 1);low = pivot + 1;//Qsort(arr, pivot + 1, high);}return 0;
}
讲解完毕。 欢迎大家提更多方案。
快速排序 算法 详解 及 深度优化相关推荐
- 快速排序算法详解(原理,时间复杂度,实现代码)
快速排序算法详解(原理.实现和时间复杂度) 快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出. 快 ...
- 十大经典排序算法-快速排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 经典排序算法(2)——快速排序算法详解
快速排序(Quick Sort)也是一种典型的交换排序算法,通过交换数据元素的位置进行排序. 一.算法基本思想 (1)基本思想 快速排序的基本思想就是:通过一趟排序将要排序的数据分割成独立的两部分,其 ...
- Java的快速排序算法详解
在进入这个话题之前大家可以想想,如果给你一个无序数组,要你处理成一个有序数组,你会怎么做? 可能是双循环的冒泡排序,可能拆开成多个子集合的再合并的希尔排序,排序算法很多,而现在要介绍的是另一种排序方法 ...
- 排序算法,最全的10大排序算法详解(Sort Algorithm)
文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...
- 排序算法(五)——堆排序算法详解及Python实现
本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...
- 十大经典排序算法-桶排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-冒泡排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-选择排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
最新文章
- 程序员or产品经理┃同是职场脱发人,光头何苦为难光头!
- Scrum 项目1.0 2.0 3.0 4.0 5.0 6.0 7.0
- windows系统修改cmd窗口编码格式
- 工具:分享IntelliJ IDEA 5条调试技巧,太实用了!
- 不要再问我跨域的问题了
- 手机运行内存6+128跟8+128有什么区别?
- keras编写自定义的层
- 精选10款超酷的HTML5/CSS3菜单
- AcWing 798. 差分矩阵
- mui ajax的值php怎样获取,关于mui.ajax的设置,以及php取不到data值的问题的方法
- 视频编解码(三):H265编码器
- html 列表实现展开和收起,实现列表展开收起效果
- Insyde uefi 隐藏设置_文颐法语:iOS 14安装后发现的9个隐藏的iPhone功能
- hdu 6184 三元环数目
- MJUPC-022_编程挑战系列赛第二十二场(以梦为“码“ “数“说未来)题解(C/C++代码)
- 网易2018年春招 校招编程题
- VS2019编译python解释器源码及学习方法
- 公考复盘(一)——第三季第四季
- 主板、CPU、显卡中字母的含义
- cas自定义登陆认证