排序算法:快速排序
来源:互联网 发布:软件研发管理体系 编辑:程序博客网 时间:2024/06/05 00:25
快速排序是实际应用中比较常用的一种排序方法,具有速度快,效率高的优点。
思想:
快速排序采用的思想是分治思想。
快速排序找出一个元素(理论上可以找任何一个元素)作为基准(key),然后对数组进行分区操作,使基准元素左边元素的值不大于基准值,基准元素右边元素的值不小于基准值。
递归快速排序,将其他n-1个元素也调整到排序后的正确位置。
即:如何调整基准 的位置以及调整返回基准的最终位置以便分治递归。
举例:
int array[6] = {3, 7, 4, 6, 5, 2};
以数组的首元素作为基准:3
3 --- 3, 7, 4, 6, 5, 2 3为基准,使用i j两个指针分别从两边进行扫描,把比3小的元素和比3大的元素分开。首先比较3和2, 2比3小,所以把2放在3的位置
3 --- 2, 7, 4, 6, 5, 2 比较3和7, i指针右移,3小于7,把7放入到刚才空出来的位置
3 --- 2, 7, 4, 6, 5, 7 比较3和5, 比较3和6,3和4,全都大于3,满足条件,故此不变
经过一轮排序,元素变为如下顺序:
2, [3], 4, 6, 5, 7
之后,再把3左边和右边的的元素进行快排,递归进行。
#include <stdio.h>void quicksort(int *a, int left, int right){int i = left;int j = right;int key = a[left];if(left >= right) //完成排序直接返回{return;}while(i < j){while(i < j && key <= a[j]){j--; //向前寻找}a[i] = a[j]; //找到key > a[j], 把该值赋予被拿走的a[i], 第一次即是key值while(i < j && key >= a[i]){i++; //向后寻找}a[j] = a[i];}a[i] = key; //完成一次快排后,就把key值回归quicksort(a, left, i - 1); //递归,用同样的方式对左边小组进行同上的做法quicksort(a, i + 1, right); //递归,用同样的方式对右边小组进行同上的做法}int main(){int a[6] = {3, 7, 4, 6, 5, 2};int left = 0;int right = 5;int i = 0;quicksort(a, left, right);for(i = 0; i < 6; i++){printf("%d ", a[i]);}printf("\n");return 0;}
时间复杂度为O(nlgn)
0 0
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法------快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法---快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- 排序算法 快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 【排序算法】快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- Android sdk自带的9patch工具(9妹)
- 保存博客
- 二叉树——C++实现
- Prime Land
- tencent-wechat/phxsql
- 排序算法:快速排序
- PointToPointNetDevice doesn't support TapBridgeHelper
- 自定义按钮--Selector
- ==与equal的区别
- POJ 2231 Moo Volume【求和】
- 自定义控件 ——可拖动测量尺子
- Git分布式版本控制系统 基本介绍
- PAT 1003. Emergency (25)(俩点间最短路径)
- V4L2视频应用程序编程架构