排序算法:快速排序

来源:互联网 发布:软件研发管理体系 编辑:程序博客网 时间: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
原创粉丝点击