“挖坑填坑”理解快速排序
来源:互联网 发布:弈乐麻将 游戏网络 编辑:程序博客网 时间:2024/06/06 02:12
快速排序的基本思路:找一个基准元素,对数组进行调整,调整的标准是,这个基准元素的左边存放的都是比这个元素小的,右边都是比这个元素大的。然后分而治之,对左右两边的子数组利用同样的规则调整,调整到每一个子数组中都只有一个元素时结束。
基本思想很简单,主要是理解如何在确定基准元素之后,对数组(子数组)进行调整,下面举个例子,用“挖坑填坑”(拆了东墙补西墙)的比喻来理解一次调整的过程。
一个无序数组:[4, 3, 7, 5, 10, 9, 1, 6, 8, 2]
1. 随便先挖个坑,就在第一个元素(基准元素)挖坑,挖出来的“萝卜”(第一个元素4)在“篮子”(临时变量)里备用。挖完之后的数组是这样:[ 坑, 3, 7, 5, 10, 9, 1, 6, 8,2]
2. 挖右坑填左坑:从右边开始,找个比“萝卜”(元素4)小的元素,挖出来,填到前一个坑里面。填坑之后:[ 2, 3, 7, 5, 10, 9, 1, 6, 8,坑]
3. 挖左坑填右坑:从左边开始,找个比“萝卜”(元素4)大的元素,挖出来,填到右边的坑里面。填坑之后:[ 2, 3,坑, 5, 10, 9, 1, 6, 8, 7]
4. 挖右坑填左坑:从右边开始,找个比“萝卜”(元素4)小的元素,挖出来,填到前一个坑里面填坑之后:[ 2, 3, 1, 5, 10, 9,坑, 6, 8, 7]
5. 挖左坑填右坑:从左边开始,找个比“萝卜”(元素4)大的元素,挖出来,填到右边的坑里面填坑之后:[ 2, 3, 1,坑, 10, 9, 5, 6, 8, 7]
6. 挖右坑填左坑:从右边开始,找个比“萝卜”(元素4)小的元素,挖出来,填到前一个坑里面,这一次找坑的过程中,找到了上一次挖的坑了,说明可以停了,用篮子里的的萝卜,把这个坑填了就行了,并且返回这个坑的位置,作为分而治之的中轴线。填坑之后:[ 2, 3, 1,4, 10, 9, 5, 6, 8, 7]
上面的步骤中,第2,4, 6其实都是一样的操作,3和5的操作也是一样的。
代码如下:
int _qucikly_sort(int arr[], int low, int high) { int pivot = arr[low]; //挖第一个坑,把“萝卜”放进篮子 while(low<high) { //开始循环挖坑填坑 //如果low等于high,说明找坑的过程中,找到了上一次挖的坑,因此可以停止了 while(low<high && arr[high]>=pivot) //从右边往左边找填坑的元素(比pivot小的元素)。 2,4,6的过程 --high; arr[low] = arr[high]; //将找到之后,挖出来,填到左边的坑里 while(low<high && arr[low]<=pivot) //从左边往右边找填坑的(比pivot大的元素)。3,5的过程 ++low;arr[high] = arr[low];//找到之后,填到右边的坑里 } arr[low] = pivot; //篮子里的“萝卜”填到坑里 return low;//返回这个坑的位置,作为分而治之的中轴}
分而治之的代码:
void quickly_sort(int arr[], int low, int high) { if (low < high) { int pivot = _qucikly_sort(arr, low, high); quickly_sort(arr, low, pivot-1); quickly_sort(arr, pivot + 1, high); }}
测试代码:
#include <stdio.h>#include <stdlib.h>void display(int arr[], int len) { for(int i = 0; i < len;i++) printf("%d ", arr[i]); printf("\n");}int main() { int arr[] = {4, 3, 7, 5, 10, 9, 1, 6, 8, 2}; quickly_sort(arr, 0, sizeof(arr)/sizeof(int) - 1);
display(arr, sizeof(arr)/sizeof(int)); return 0;}
- “挖坑填坑”理解快速排序
- 快速排序理解(挖坑填坑比喻理解)
- 以“挖坑填数”思想理解快速排序
- 快速排序理解(挖坑填数策略)
- 快速排序--挖坑填数+分治法
- 快速排序之“挖坑填数+分治”思想实现
- 快排序 挖坑填数
- 挖坑型快速排序
- 快速算法实现----挖坑填数
- 从挖坑填数和分治法来诠释快速排序
- 一头扎进算法导论-快速排序(挖坑填数策略)
- 快速排序 “挖坑填空”实现
- 开始2017挖坑填坑之路
- 快速排序的实现--挖坑法
- 快速排序挖坑法理解与实现
- 快速排序之挖坑填补法
- 挖坑待填
- 挖坑待填
- 知识点复习
- Spring AOP 之 通知、连接点、切点、切面
- HDU 4273(计算几何+凸包重心)
- 二叉树的创建与遍历(递归)
- 第四周训练总结(一)
- “挖坑填坑”理解快速排序
- Oracle数据库入门 基础知识day05 火推阳光笔记
- 2017-09-21 LeetCode_031 Next Permutation
- Android Crash日志收集
- LWC 50:677. Map Sum Pairs
- 47. 数据结构笔记之四十七的有向无环图的应用排序
- 携程2018 秋招编程题
- Android组件化之终极方案
- 网页性能如何优化