十大基础排序 · 四 --- 快速排序(不稳定)挖坑填补法+区间分割法+3种优化方法
来源:互联网 发布:软件安装手册 编辑:程序博客网 时间:2024/05/17 10:27
1. 分析
/*4. 快速排序(QuickSort)#平均时间复杂度: O(nlogn) #最坏时间复杂度:O(n2) (有序的情况)#空间复杂度:需要一个栈空间, 若每趟排序将记录均匀分割成两个相近的子序列,则栈的最大深度为 向下取整[logn]+1; 若偏向一边, 最坏情况,栈最大深度为n; 在一趟分割后比较分割后的长度,先对短序列排序,则栈最大深度为O(logn);#特点: 快速排序是比较次数最少的排序,当待排数组基本有序时退化为冒泡排序。#基本思想: 快速排序是对冒泡排序的一种改进。 通过一趟排序将待排记录分割成独立两部分,其中一部分记录关键字均比另一部分记录的关键字小。 则可分别对这两部分记录继续进行排序,以达整个序列有序。实现方法:递归#方法一:挖坑填补法 1. 选取一个标记(第一个点) 2. 从后向前找第一个比标记小的,然后放到 空出来的位置 3. 从前向后遍历,找第一个比标记大的,然后放到空出来的位置 4. 继续从后向前找,重复2 5. 继续从前向后找大的,重复3 6. 直到 前后的 遇到,该位置就是被标记数字的位置; 7. 一趟完成,把数组分为大于标记和小于标记两部分; 8,重复1-7#方法二:区间分割法 1. 取最后一个位置标记,用nSmall标记小区间大小,i 用来遍历数组; 2. 遍历值小于标记值:小区间的下一个不是当前位置,需要交换,否则直接小区间位置+1 3. 如此循环到 标记位置(最后一个元素) 4. 最后一个元素放到 s+1 的位置;优化1:降低小概率事件(最后一个元素就是最大值) 可取“前中后”三个位置的值进行比较,把中间值交换到最后一个元素位置;优化2:减少系统异常(递归带来的问题) 可用 栈+循环 代替递归优化3:元素过少,选择插入排序。*/
2. 源码
int Sort(int *arr, int nLow, int nHigh);int Sort2(int *arr, int nLow, int nHigh);void QuickSort(int*arr, int nLow, int nHigh){ if(arr == NULL || nLow < 0 || nHigh < 0) { return ; } //递归结束条件 if( nLow >= nHigh) return ; int nStandard = Sort(arr, nLow, nHigh); QuickSort(arr, nLow, nStandard -1); QuickSort(arr, nStandard+1, nHigh);}//方法1: 挖坑填补法int Sort(int *arr, int nLow, int nHigh){ //1. 选取一个标记(第一个点) int nMark = arr[nLow]; while(nLow < nHigh) { //2. 从后向前找第一个比标记小的,然后放到 空出来的位置 while(nLow < nHigh && arr[nHigh] >= nMark) nHigh--; arr[nLow] = arr[nHigh]; //3. 从前向后遍历,找第一个比标记大的,然后放到空出来的位置 while(nLow < nHigh && arr[nLow] < nMark) nLow++; arr[nHigh] = arr[nLow]; //4. 继续从后向前找,重复2 //5. 继续从前向后找大的,重复3 }//6. 直到 前后的 遇到,该位置就是被标记数字的位置; arr[nLow] = nMark; //7. 一趟完成,把数组分为大于标记和小于标记两部分; return nLow;}//方法2: 区间分割法int Sort2(int *arr, int nLow, int nHigh){ //1. 取最后一个位置标记,用nSmall标记小区间大小,i 用来遍历数组; int nMark = arr[nHigh]; int nSmallIndex = nLow-1; int i; for(i = nLow; i< nHigh; i++) { //2. 遍历值小于标记值:小区间的下一个不是当前位置,需要交换,否则直接小区间位置+1 if(arr[i] < nMark) { if(++nSmallIndex != i) { arr[i] = arr[nSmallIndex] ^ arr[i]; arr[nSmallIndex] = arr[nSmallIndex] ^ arr[i]; arr[i] = arr[nSmallIndex] ^ arr[i]; } } //3. 如此循环到 标记位置(最后一个元素) }//i = nHigh; //4. 最后一个元素放到 s+1 的位置; if(++nSmallIndex != nHigh) { arr[nHigh] = arr[nHigh] ^ arr[nSmallIndex]; arr[nSmallIndex] = arr[nHigh] ^ arr[nSmallIndex]; arr[nHigh] = arr[nHigh] ^ arr[nSmallIndex]; } return nSmallIndex;}
阅读全文
0 0
- 十大基础排序 · 四 --- 快速排序(不稳定)挖坑填补法+区间分割法+3种优化方法
- 快速排序之挖坑填补法
- 十大基础排序 · 九 --- 桶排序(不稳定)
- 十大基础排序 · 六 --- 堆排序(不稳定)
- 十大基础排序 · 五 --- 选择排序(不稳定)
- 十大基础排序 · 二 --- 希尔排序(不稳定)
- 快速排序的实现--挖坑法
- 快速排序--挖坑填数+分治法
- 排序——快速排序挖坑法的变形
- 挖坑型快速排序
- 经典排序算法-快速排序(挖坑法、前后指针法)、基数排序
- 排序算法---之交换排序(冒泡排序&快速排序-左右指针法,挖坑法,前后指针法)
- 【数据结构】快速(QuickSort)排序之——挖坑法
- 内部排序(四)快速排序法
- 十大基础排序 · 十 --- 基数排序(稳定)
- 快速排序经典算法(分治法,挖坑法,前后指针法,非递归)
- 快速排序 “挖坑填空”实现
- php四种基础排序(基础算法)----④快速排序法
- LeetCode-434. Number of Segments in a String
- 16.5的PowerDesigner中的to be Implemented找不到,inherited也找不到
- win10+VS2013编译caffe的common.cpp错误error C4996: ‘getpid': The POSIX name for this item is deprecated.
- Linux达人养成记Ⅰ笔记
- python——数据可视化:matplotlib,seaborn,pandas
- 十大基础排序 · 四 --- 快速排序(不稳定)挖坑填补法+区间分割法+3种优化方法
- GNU/GPL/Linux/GCC工具链历史
- eclipse快捷键
- SqlServer存储过程介绍
- Uart串口通信的理解
- 解决IDEA、PyCharm、PhpStorm及Android Studio中输入法卡住、光标不跟随的问题
- Java 随机给二维数组赋值,打印输出每个元素
- async和await简化回调函数嵌套
- Test 4 for NOIP- Result for Day3(误)