算法导论-第7章 - 快速排序
2014-09-28 10:42
176 查看
7.1 <<-------------------------------------普通快速排序---------------------------------------->>
与归并排序一样,快速排序也使用了分治思想。数组被划分为两个(可能为空)子数组a[p...q-1]和a[q+1...r],使得a[p...q-1]的每一个元素都小于a[q],而a[q]也都小于等于a[q+1...r]中的每一个元素
另外一种普通快排,和上一个类似。不同的是它每次一区间数组的第一个为判断节点,就只有Partion函数有改变,其他的函数可以参照上面的
当快速排序终止时,它将数组分为3个集合,所有小于等于x元素的集合,大于x的集合和只有一个x一个元素的集合
快速排序的性能:
划分平衡时,快排性能和归并排序一样,如果不平衡,则接近于插入排序
平衡的划分:
快排的平均运行时间接近于其最好情况((nlog(n))),而非最坏情况((n^2))
快排可看成快速排列递归树
7.1 <<-------------------------------------快速排列的随机化版本---------------------------------------->>
快速排序的随机化对PARTION和QUICKSORT代码改动很小,在新的划分程序中,只是在划分前进行一次交换
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-------------------------------------------------------------------
其实还有另外一种形式的快速排序的方法,但是实质是一样的,这种方式的快速排序也是比较常用的。如下所示:
个人感觉这种方法初看没有《算法导论》中的快速排序方法理解起来简单,但是理解后就会发现这种方式的排序也是很好的。^_^没有了两个数之间的数据交换,只是简单的赋值操作。
与归并排序一样,快速排序也使用了分治思想。数组被划分为两个(可能为空)子数组a[p...q-1]和a[q+1...r],使得a[p...q-1]的每一个元素都小于a[q],而a[q]也都小于等于a[q+1...r]中的每一个元素
void Swap(int *a, int *b) { int t; t = *a; *a = *b; *b = t; } int Partion(int a[], int low, int high) { int x; int i, j; x = a[high]; i = low; for(j = low; j < high; j++) { if(a[j] <= x) { Swap(&a[i], &a[j]); i++; } } Swap(&a[i], &a[high]); return i; } void QuickSort(int a[], int low, int high) { int mid; if(low < high) { mid = Partion(a, low, high); QuickSort(a, low, mid-1); QuickSort(a, mid+1, high); } } int main(void) { int a[10] = {2, 5, 7, 9, 0, 1, 3, 4, 8, 6}; int i; QuickSort(a, 0, 9); for(i = 0; i < 10; i++) printf("%d ", a[i]); return 0; }
另外一种普通快排,和上一个类似。不同的是它每次一区间数组的第一个为判断节点,就只有Partion函数有改变,其他的函数可以参照上面的
int Partion(int a[], int low, int high) { int x; int i, j; x = a[low]; i = high; for(j = high; j > low; j--) { if(a[j] >= x) { Swap(&a[i], &a[j]); i--; } } Swap(&a[i], &a[low]); return i; }
当快速排序终止时,它将数组分为3个集合,所有小于等于x元素的集合,大于x的集合和只有一个x一个元素的集合
快速排序的性能:
划分平衡时,快排性能和归并排序一样,如果不平衡,则接近于插入排序
平衡的划分:
快排的平均运行时间接近于其最好情况((nlog(n))),而非最坏情况((n^2))
快排可看成快速排列递归树
7.1 <<-------------------------------------快速排列的随机化版本---------------------------------------->>
快速排序的随机化对PARTION和QUICKSORT代码改动很小,在新的划分程序中,只是在划分前进行一次交换
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-------------------------------------------------------------------
其实还有另外一种形式的快速排序的方法,但是实质是一样的,这种方式的快速排序也是比较常用的。如下所示:
int QuickPass(int a[], int low, int high) { int x = a[low]; if(low < high) { while(low < high) { while(low<high && a[high]>=x) high--; a[low] = a[high]; while(low<high && a[low]<=x) low++; a[high] = a[low]; } a[low] = x; } return low; } void QuickSort(int a[], int low, int high) { int mid; if(low < high) { mid = QuickPass(a, low, high); QuickSort(a, low, mid-1); QuickSort(a, mid+1, high); } }
个人感觉这种方法初看没有《算法导论》中的快速排序方法理解起来简单,但是理解后就会发现这种方式的排序也是很好的。^_^没有了两个数之间的数据交换,只是简单的赋值操作。
相关文章推荐
- 算法导论 第7章 快速排序
- 《算法导论》第7章 快速排序 (四种变形)
- 《算法导论》第7章 快速排序 个人笔记
- 算法导论第7章快速排序答案
- 《算法导论》第7章 快速排序 (四种变形)
- 算法导论第7章快速排序
- 算法导论学习笔记 第7章 快速排序
- 《算法导论》第7章 快速排序 (四种变形)
- 《算法导论》读书笔记之第7章 快速排序
- 《算法导论》读书笔记之第7章 快速排序
- 《算法导论》笔记 第7章 7.1快速排序的描述
- 《算法导论》笔记 第7章 7.1快速排序的描述
- 算法导论学习笔记-第7章 快速排序
- 算法导论 第7章 快速排序
- 算法导论 第7章 快速排序
- 《算法导论》笔记 第7章 7.2快速排序的性能
- 算法导论 第7章 快速排序 学习总结
- 《算法导论》笔记 第7章 7.2快速排序的性能
- 《算法导论》 第7章 快速排序
- 《算法导论》笔记 第7章 7.3快速排序的随机化版本