快速排序
来源:互联网 发布:南京江宁教育网络问政 编辑:程序博客网 时间:2024/05/21 18:41
概要
- 理解快速排序的思想
- 理解分治以及排序过程的设计巧妙之处
- 深入理解时间复杂度分析,最好与最坏情况下的时间复杂度分析,生成树分析法,代入法,主方法。
伪代码
//返回的是分割点,即主元//循环维护的部分为四个部分// p...i...j.....r// p..i 维护 <= r 的元素// i+1 ... j 维护 > r 的元素// j+1 ... r-1 的元素暂时没有处理,一次过程只需要O(n)// r主元作为评价标准partition(A, p, r){ x = A[r]; //主元,作为依据 i = p - 1; for j = p to r-1 { if (A[j] <= x) //升序 { i++; exchange A[i] with A[j] } } exchange A[i + 1] with A[r] return i + 1; }//第一次调用的时候要用, qsort_normal(A, 1, A.length);qsort_normal(A, p, r){ if (p < r) { q = partition(A, p, r); qsort_normal(A, p, q - 1); qsort_normal(A, q + 1, r); }}
最好情况下,期望时间复杂度是 O(n * log n)
最坏情况下,期望时间复杂度是 O(n * n)
一般情况下,划分会导致一部分差一部分好,只要好坏的比例是常数比例,其期望时间复杂度就是 O(n * log n),可以用生成树来证明:
假设比例是 alpha : 1 - alpha , (alpha <= 1/2)
那么 alpha < 1 - alpha
因此生成树里最先到达叶子的部分(即最短)满足:
c * exp(alpha, k) = 1
最后到达叶子的部分(即最长)满足:
c * exp(1-alpha, k) = 1
求解,都是log n,加上n次,因此复杂度仍然是 O(n * log n)
实现代码
qsort.h文件
#ifndef QSORT_NORMAL_H#define QSORT_NORMAL_H#include <stdio.h>#include <stdlib.h>typedef int DATATYPE;int partition(DATATYPE *array, DATATYPE p, DATATYPE r){ DATATYPE pivot = array[r]; DATATYPE i = p - 1; for (DATATYPE j = p; j <= r - 1; j++) { if (array[j] <= pivot) { i++; DATATYPE temp = array[i]; array[i] = array[j]; array[j] = temp; } } DATATYPE temp_ = array[i + 1]; array[i + 1] = array[r]; array[r] = temp_; return i + 1;}void qsort_normal(DATATYPE *array, DATATYPE i, DATATYPE j){ // first call (A, 1, length); if (i < j) { DATATYPE q = partition(array, i, j); qsort_normal(array, i, q - 1); qsort_normal(array, q + 1, j); }}#endif
qsort.c 文件
#include "./qsort_normal.h"int main(){ DATATYPE array[11] = {3, 4, 5, 1, 7, 23, 8, 10, 4, 2}; qsort_normal(array, 0, 10); for (int i = 1; i <= 10; i++) { printf("%d ", array[i]); } return 0;}
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- Java操作HBase表入门
- 【2011集训队出题】圈地计划
- 三层基础知识梳理
- Android - Acitivty生命周期 理解
- 摘录 Multiple View Geometry in Computer Vision preface
- 快速排序
- Uva11292 The Dragon of Loowater
- HDOJ 2149 Public Sale 【巴什博弈】
- Python爬虫——爬取网站的图片
- 大数据下union all的视图分页解决方案
- lightoj 1026 - Critical Links 【DFS求块 + 边双连通求桥】
- mysql常见问题分享 - baidu
- C# WPF 保存WriteableBitmap图像
- 懒加载-可变数组