快速排序详解
2016-09-11 00:17
176 查看
基本概念:
快速排序是一种分治的排序算法,由C. A. R. Hoare在1962年提出。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
如何切割成两部分:
a) 假设有两个指针low和high,它们的初值分别为low和high
b) 设关键值为key(通常取第一个值)
c) 首先从high所指位置起往前搜索找到第一个比key小的值,和key交换
d) 然后从low所指位置起往后搜索找到第一个比key大的值,和key交换
e) 重复c/d这两步直至low=high为止
复杂度:
最差时间复杂度 (n²)
最优时间复杂度 (nlogn)
平均时间复杂度 (nlogn)
平均空间复杂度(logn)
动态图:
动态图:
简单例子:
切割流程:
源码:
编译运行:
原文出自:http://blog.csdn.net/daiyudong2020/article/details/52498220
End;
快速排序是一种分治的排序算法,由C. A. R. Hoare在1962年提出。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
如何切割成两部分:
a) 假设有两个指针low和high,它们的初值分别为low和high
b) 设关键值为key(通常取第一个值)
c) 首先从high所指位置起往前搜索找到第一个比key小的值,和key交换
d) 然后从low所指位置起往后搜索找到第一个比key大的值,和key交换
e) 重复c/d这两步直至low=high为止
复杂度:
最差时间复杂度 (n²)
最优时间复杂度 (nlogn)
平均时间复杂度 (nlogn)
平均空间复杂度(logn)
动态图:
动态图:
简单例子:
切割流程:
源码:
#include <stdio.h> /* 切分数组 */ int partition(int a[], int first, int last) { int i = first; int j = last; int key = a[first]; /* 用第一个值作为关键值 */ printf("the key is %d; ", key); while (i < j) { /* 从右往左比较 */ while (i < j && a[j] >= key) { --j; /* 向前找 */ } a[i] = a[j]; /* 将比关键值小的移到低端 */ /* 从左往右比较 */ while (i < j && a[i] <= key) { ++i; /* 向后找 */ } a[j] = a[i]; /* 将比关键值大的移到高端 */ } /* 此时i == j,更改为关键值 */ a[i] = key; /* 打印合并后的数据 */ int k; for (k = first; k <= last; ++k) printf("%d ", a[k]); printf("\n"); return i; /* 返回关键值位置 */ } /* 递归方式 */ void sort(int a[], int first, int last) { if (a != NULL && first < last) { int key = partition(a, first, last); sort(a, first, key-1); sort(a, key+1, last); } } int main() { int arr[] = {49, 38, 65, 97, 76, 13, 27}; int size = sizeof(arr) / sizeof(int); //sort sort(arr, 0, size - 1); //print int i = 0; printf("end sort: "); for (i; i < size; ++i) { printf("%d ", arr[i]); } printf("\n"); return 0; }
编译运行:
原文出自:http://blog.csdn.net/daiyudong2020/article/details/52498220
End;
相关文章推荐
- 快速排序详解,附源码
- 快速排序 详解
- 【万字总结】快速排序详解与各种线性时间排序对比
- 快速排序详解
- 快速排序详解 Java实现
- 快速排序详解
- 数据结构-排序算法详解(插入排序,希尔排序,堆排序,归并排序,快速排序,桶式排序)
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 快速排序(Quicksort)详解
- 快速排序详解
- 快速排序详解以及java实现
- 快速排序详解--C语言实现
- 快速排序 详解
- 快速排序--过程详解
- 【内部排序】五:快速排序(Quick Sort)详解与代码
- [数据结构]原创!amor详解 快速排序 使用以及心得
- 快速排序详解
- 算法之快速排序 详解!
- 快速排序和二分查找时间复杂度详解
- 快速排序详解