[7] 算法之路 - 快速排序之3轴演算
2014-08-21 00:09
176 查看
左轴演算、中轴演算、右轴演算
题目:
快速排序法(quick sort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。
快速排序 - 算法
1、快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二
2、分别对左边与右边数列进行排序
左轴演算:
中轴演算
右轴演算
题目:
快速排序法(quick sort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。
快速排序 - 算法
1、快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二
2、分别对左边与右边数列进行排序
左轴演算:
// 快速排序 - 左轴演算 // 1. 附设两个指针left/right,并设最左端的数为最初枢轴pivot // 2. 从右向左搜索,找到第一个比pivot小的数,将其缓存进枢轴位置 // 3. 从左向右搜索,找到第一个比pivot大的数,缓存进上一个比pivot小的数的位置程式进入2.循环 // 4. 最后一次交换后获得的有效空位置为a[i] ,此时再将pivot赋值给a[i] 此时a[i]左边的数比a[i]小,右边的数比a[i]大 // 再分别对其左边与左边进行快速排序 int QuickSort2(int a[],int left,int right) { if(left<right) { int i = left,j=right,pivotloc=a[left]; while(i < j) { while(i<j && a[j]>=pivotloc) j--; if(i<j) a[i++]=a[j]; while(i<j && a[i]<pivotloc)i++; if(i<j) a[j--]=a[i]; } a[i]=pivotloc; QuickSort2(a,left,i-1); QuickSort2(a,i+1,right); } return 0; }
int QuickSort5(int a[],int left,int right) { if(left<right) { int i = left,j=right,pivotloc=a[left]; while(i < j) { while(i<j && a[i]<=pivotloc) i++; while(i<j && a[j]>pivotloc) j--; if(i<j) { SWAPER(a[i],a[j]); i++;j--; } } if(a[j]<a[left]) { SWAPER(a[left],a[j]); } QuickSort5(a,left,j-1); QuickSort5(a,j,right); } return 0; }
中轴演算
// 快速排序 int QuickSort3(int a[],int left,int right) { int i,j,pivot; if(left<right) { pivot=a[(left+right)/2]; i=left-1; j=right+1; while(i<j) { while(a[++i]<pivot) ; while(a[--j]>pivot) ; if(i<j) SWAPER(a[i],a[j]); } QuickSort3(a,left,i-1); QuickSort3(a,j+1,right); } return 0; }
右轴演算
// 快速排序演算 // 1. 首先选择最右边的元素作为枢轴pivot // 2. 从左向右搜索,寻找小于pivot的数,将其与左边第一个未交换的元素交换 // 3. 当搜索到最右边时,左边已交换的数都比pivot小,而未交换的都比pivot大 // 4. 将左边的第一个未交换的元素与最右边的pivot元素交换,并返回该未交换元素的索引 // 此时i左边的元素比i小,右边的比i大 // 程式进入.循环分别对0 →i -1 及最右边的i+1→right进行递归(快速排序) 最终该序列会变为有序 int Partition2(int a[],int left,int right) { int i = left,j; int pivot=a[right]; for(j=left;j<right;j++) { if(a[j]<pivot) { if(i!=j)SWAPER(a[i],a[j]); i++; } } if(i!=right)SWAPER(a[i],a[right]); return i; } int QuickSort4(int a[],int left,int right) { int pivot; if(left<right) { pivot=Partition2(a,left,right); QuickSort4(a,left,pivot-1); QuickSort4(a,pivot+1,right); } return 0; }
相关文章推荐
- [7] 算法之路 - 高速排序之3轴演算
- 算法记录:二进制快速排序
- 插入排序,合并排序,堆排序,快速排序,计数排序的实现(算法导论)
- 读书笔记 算法导论 快速排序 QuickSort 使用最后一个元素作为pivot
- [每周一算法]快速排序
- 快速排序 php实现 算法学习
- 快速排序的C#实现以及,算法导论上之后一个习题的思考
- 白话经典算法系列之六 快速排序 快速搞定
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- C#算法-------(五)快速排序
- java基础知识之 算法 【冒泡排序】【快速排序】
- C#算法-------(四)快速排序
- 【经典算法】快速排序
- 快速排序与快速选择算法(quick sort and quick select algorithm)
- 算法导论 第七章快速排序与随机快速排序
- 算法与数据结构——快速排序 Quick Sort
- c#与算法--快速排序
- 算法复习:快速排序
- 【快速排序】算法实现
- 算法的独家记忆--快速排序