再次学习快速排序——优化
2018-03-27 23:14
204 查看
今天,我学习了一些优化快速排序的方法。
附上代码:
(优化前的代码为被注释掉的代码,优化后的代码我也用中文注释加以说明了)
附上代码:
(优化前的代码为被注释掉的代码,优化后的代码我也用中文注释加以说明了)
#include <stdio.h> void swap(int *a, int *b); void QuickSort(int *a, int low, int high) { //if(low < high) while(low < high) //优化:"尾递归",减少递归深度 { int pivot = Partition(a, low, high); QuickSort(a, low, pivot-1); //QuickSort(a, pivot+1, high); low = pivot+1; //优化:"尾递归",减少递归深度 } } int Partition(int *a, int low, int high) { int mid = low + (high-low)/2; //***** if(a[low] > a[high]) swap(&a[low], &a[high]); if(a[mid] > a[high]) //优化:"三数取中",平衡递归树 swap(&a[mid], &a[high]); if(a[low] < a[mid]) swap(&a[low], &a[mid]); //***** int pivotkey = a[low]; while(low < high) { while(low < high && a[high] >= pivotkey) high--; //swap(&a[low], &a[high]); a[low] = a[high]; //优化:减少不必要的交换 while(low < high && a[low] <= pivotkey) low++; //swap(&a[low], &a[high]); a[high] = a[low]; //优化:减少不必要的交换 } a[low] = pivotkey; return low; } int main() { int i; int a[10] = {7, 3, 5, 8, 0, 4, 9, 1, 6, 2}; for(i = 0; i <10; i++) printf("%d ", a[i]); printf("\n"); QuickSort(a, 0, 9); for(i = 0; i <10; i++) printf("%d ", a[i]); printf("\n"); return 0; } void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; }
相关文章推荐
- C++学习 - 快速排序,更加优化的实现
- 算法导论学习笔记(一)快速排序及优化
- 快速排序的分析与优化
- 算法学习笔记之快速排序
- 快速排序的几种方法及其优化
- 快速排序的优化
- 快速排序的优化及其与qsort的比较
- 跟着《算法导论》学习——快速排序
- 优化快速排序 C语言代码
- 快速排序优化-尾递归(需再加内容)
- 快速排序的优化 - 数据结构和算法97
- 算法学习--希尔和快速排序
- 算法导论:快速排序优化算法!
- 数据结构&算法学习笔记: 快速排序
- 快速排序 优化 详细分析
- 算法第四版学习笔记之快速排序 QuickSort
- C++学习笔记(二)——快速排序的库函数实现
- 快速排序的三种优化
- 快速排序学习笔记
- 六种排序方法的学习(直接插入、希尔、冒泡、快速、选择、归并)