排序算法之快速排序
来源:互联网 发布:python return怎么用 编辑:程序博客网 时间:2024/05/31 06:23
快速排序(Quicksort)
快速排序是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
快速排序算法:
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]赋给A[i];
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]赋给A[j];
5)重复第3、4步,直到i=j;(3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i,j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
快速排序算法实现及注释
//思想: 分治:将待排序的数组划分为两个部分 产生一个基准,左边的均小于基准 右边的均大于基准 找出基准正确的位置\然后进行递归调用void quick_sort(int *a,int low,int high){int i = low;int j = high;int key = a[low];while(i<j){//从右边开始找出比基准小的数,找到小于等于基准的数 为什么外层已经判断了i<j为什么还要判断呢? 假设如果第一个元素为最小的元素 那么j会一直递减//直到等于-1while(i<j&&a[j]>=key){j--;}if(i<j){a[i] = a[j];i++;}//从左边开始找出比基准大的数,找到大于等于基准的数while(i<j&&a[i]<=key){i++;}if(i<j){a[j] = a[i];j--;}}//条件结束时i = j,将基准放入正确的位置a[i] = key;//加判断条件是为了防止堆栈溢出if(i-low>1)quick_sort(a,low,i-1);if(high-i>1)quick_sort(a,i+1,high);}
阅读全文
0 0
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法 之 快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 通过 lua 进行 nginx redis 访问控制
- 【ACF学习】ACF安装、训练及检测初探
- HLS实现Bilateral Filtering双边滤波器
- 前端基础进阶(三):变量对象详解
- android设置EditView文本框不能编辑:
- 排序算法之快速排序
- NB-IoT和eMTC对比
- 前端基础进阶(四):详细图解作用域链与闭包
- mysql-架构
- 有哪些值得推荐的计算机专业的竞赛?
- 图解 Navicat for MySQL 快捷键
- Android 中的动画有哪几类,它们的特点和区别是什么?
- Nginx配置http强制跳转到https
- JAVA线程阻塞