快速排序详解
来源:互联网 发布:知世故而不世故 编辑:程序博客网 时间:2024/05/18 01:49
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
快速排序的关键是枢轴量的选取,其原理是选择一个枢轴量对记录进行比较,使小于枢轴量的调整到数组的坐标,大于枢轴量的调整到数组的右边。即该方法的基本思想可描述为:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
#include "stdafx.h"#include <stdlib.h>#include <stdio.h>void swap(int &data1,int&data2){int temp = data1; data1 = data2; data2 = temp;}int Partion(int * arr,int low,int high){int start = low;int end = high;int pivokey = arr[start];//第一个元素作为枢轴元素,注意是arr[start]while (start < end){while(start < end && arr[end] >= pivokey)end--;swap(arr[start],arr[end]);while(start < end && arr[start] <= pivokey)start++;swap(arr[start],arr[end]);}return start;}void Qsort(int *arr,int start,int end){ int pivot; if (start < end) { pivot = Partion(arr,start,end); Qsort(arr,start,pivot-1); Qsort(arr,pivot + 1,end); }}void QuickSort(int *arr,int len){ Qsort(arr,0,len - 1);}void main(){int arr[] = {100,57, 68, 59, 52, 72, 28, 96, 33, 24};int len = sizeof(arr)/sizeof(int);QuickSort(arr,len);for(int i = 0;i < len;i++) printf("%d ",arr[i]);system("pause");}
或者Partition()函数也可为:
int Partion(int * arr,int low,int high){//2.int nKey = high; //数组的最后一个元素是arr[nRight]int i = low - 1;for (int j = low; j < high; j++){if (arr[j] < arr[nKey]){i++;swap(arr[i],arr[j]);}}swap(arr[i+1], arr[high]);return i + 1;}
分析:
快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。
最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。时间复杂度为O(n*n)
在最好情况下,每次划分所取的基准都是当前无序区的"中值"记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:O(nlgn)
尽管快速排序的最坏时间为O(n2),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。它的平均时间复杂度为O(nlgn)。
0 0
- 快速排序详解
- 快速排序(详解)
- 快速排序法详解
- 快速排序详解
- 快速排序 详解
- 快速排序法详解
- 快速排序法详解
- Java快速排序详解
- 快速排序详解
- 快速排序详解
- 快速排序详解
- 快速排序--过程详解
- 快速排序详解
- 快速排序详解
- 快速排序代码详解
- 【19】-快速排序详解
- 快速排序详解
- 快速排序详解
- codeforces 559C|51nod1486 Gerald and Giant Chess(组合数学+逆元)
- 一些简单的例子让你在Java中能更好的学习并理解循环结构(1)!
- keepalived+nginx双机热备+负载均衡
- 树塔狂想曲【NOIP2016提高A组模拟9.3】
- 玩转四旋翼无人机(sensor数据融合)
- 快速排序详解
- [Intel汇编-NASM]任务控制以及特权级保护
- 上下界网络流
- 64M内存寻址
- apache 2.4 php7安装配置
- mysql流式读取大数据量与批量插入数据分析
- 腾讯笔试编程题:算法基础-字符移位(C++)
- JavaScript charAt()、indexOf()、substr()、substring()
- 计算机硬件初识